1. 程式人生 > >C#反射機制來獲取類 屬性的描述

C#反射機制來獲取類 屬性的描述

自定義特性(Custom Attributes)


namespace Demo_One

{
    [Serializable]
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = false)]
    [ComVisible(true)]
    public class RecordAttribute:Attribute
    {
        private string recordType;      // 記錄型別:更新/建立
        private string author;          // 作者
        private DateTime date;          // 更新/建立 日期
        private string memo;         // 備註


        // 建構函式,建構函式的引數在特性中也稱為“位置引數”。
        public RecordAttribute(string recordType, string author, string date)
        {
            this.recordType = recordType;
            this.author = author;
            this.date = Convert.ToDateTime(date);
        }


        // 對於位置引數,通常只提供get訪問器
        public string RecordType { get { return recordType; } }
        public string Author { get { return author; } }
        public DateTime Date { get { return date; } }


        // 構建一個屬性,在特性中也叫“命名引數”
        public string Memo
        {
            get { return memo; }
            set { memo = value; }

        }

    }

}

我們發現在這個特性的定義上,又用了三個特性去描述它。這三個特性分別是:Serializable、AttributeUsage 和 ComVisible。Serializable特性我們前面已經講述過,ComVisible簡單來說是“控制程式集中個別託管型別、成員或所有型別對 COM 的可訪問性”(微軟給的定義)。這裡我們應該注意到:特性本身就是用來描述資料的元資料,而這三個特性又用來描述特性,所以它們可以認為是“元資料的元資料”(元元資料:meta-metadata)。

AllowMutiple 屬性用於設定該特性是不是可以重複地新增到一個型別上(預設為false),

Inherited 就更復雜一些了,假如有一個類繼承自我們的DemoClass,那麼當我們將RecordAttribute新增到DemoClass上時,DemoClass的子類也會獲得該特性。而當特性應用於一個方法,如果繼承自該類的子類將這個方法覆蓋,那麼Inherited則用於說明是否子類方法是否繼承這個特性。


namespace Demo_One
{
    [Record("ITone", "ITone", "2018-8-8")]
    [Record("ITone", "ITone", "2018-8-8",Memo ="測試儀")]
    [Record("ITone", "ITone", "2018-8-8")]
    public class TestClass
    {
       [Description("中文名字")]
        public string Name { get; set; }
        [Description("描述使用者的ID")]
        public string UserID { get; set; }


        [Obsolete("請使用新的方法 ")]
        public void SendMsg()
        {
            Console.Write("xxxxx");
        }
        public void SendMsg(string ms)
        {
            Console.Write("x1222xxxx");
        }
    }
}

 class Program
    {
        static void Main(string[] args)
        {
            Type t = typeof(TestClass);
            Object[] records = t.GetCustomAttributes(typeof(RecordAttribute), false);
            foreach (RecordAttribute record in records)
            {
                Console.WriteLine("      型別:{0}", record.RecordType);
                Console.WriteLine("      作者:{0}", record.Author);
                Console.WriteLine("      日期:{0}", record.Date.ToShortDateString());
                if (!String.IsNullOrEmpty(record.Memo))
                {
                    Console.WriteLine("      備註:{0}", record.Memo);
                }
            }
            //獲取這個物件的所有公共屬性
            PropertyInfo[] zh = t.GetProperties();
            foreach (var item in zh)
            {
                //獲取屬性的描述
               Object[] obs= item.GetCustomAttributes(typeof(DescriptionAttribute),false);
                foreach (DescriptionAttribute record in obs)
                {
                    Console.WriteLine("      型別:{0}", record.Description);
                  
                }
            }    
            //通過反射來建立一個實體                                          
            TestClass ass = (TestClass)Assembly.GetExecutingAssembly().CreateInstance("Demo_One.TestClass");
            ass.SendMsg("");
        }
    }

相關推薦

C#反射機制獲取 屬性描述

自定義特性(Custom Attributes) namespace Demo_One {     [Serializable]     [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method

利用反射機制獲取的欄位、方法、並實現簡單呼叫

 這篇文章是為之後要介紹Android的ICO框架做預備的,所以,如果想最近學習Android的ICO框架的同學,可以稍微看一下。 首先,簡單介紹一下Java裡面的反射。 JAVA反射機制是在執行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個物件

通過java反射機制獲取物件的屬性和值(包括所有繼承的父

      java的反射機制提供了兩種方法:    getDeclaredFields() :該方法能獲取到本類的所有屬性,包括private,protected和public,但不能獲取到繼承的父類的屬性。    getFields():既能獲取本類的屬性也能得到父類的

JAVA的newInstance()和new的區別(JAVA反射機制,通過獲取該類的例項化物件)

newInstance()是實現IOC、反射、面對介面程式設計 和 依賴倒置 等技術方法的必然選擇,new 只能實現具體類的例項化,不適合於介面程式設計。 裡面就是通過這個類的預設建構函式構建了一個物件,如果沒有預設建構函式就丟擲InstantiationException, 如果沒有訪問預設建構函式的許可權

通過java反射機制獲取對象的屬性和值(包括所有繼承的父

原創 getc getname 因此 declared protect 版權 str 來源 java的反射機制提供了兩種方法: getDeclaredFields() :該方法能獲取到本類的所有屬性,包括private,protected和public,但不能獲取到

C#獲取屬性

bsp inf info string nbsp obj list getprop null C#獲取類屬性 Type t = fxsinfo.GetType(); PropertyInfo[] PropertyList = t.GetProper

C#反射機制 Type型別的獲取方式

有三種方式獲取Type型別 程式碼如下: using System; using System.Collections.Generic; using System.Linq; using System.

C#反射遍歷/查詢中的屬性以及值

    CSDN廣告是越來越多了,所有部落格筆記不再更新,新網址 DotNet筆記 遍歷一個類/或類物件的屬性/值,很有用,看個例子 using System; using System.Collections.Generic; using System.Linq; u

c++ 反射機制: 用名作變數,動態建立物件

什麼是反射 從建立物件的角度上來看,狹義的說,比如有個 class A ,你能直接 new A() 來建立 物件。但是如果想根據字串 “A” 來建立 class A 的物件,比如 使用 new “A” 的形式來建立 物件,甚至 “A” 是個變數。 str =

跟著辛星用PHP的反射機制實現插件

red 實現 track 這一 列表 each 方法 fun 繼承 我的博文的前一篇解說了PHP的反射機制是怎麽回事,假設讀者還不清楚反射機制,能夠搜索下或者看我的博文,都是不錯的選擇。我們開始解說一下怎麽用PHP來實現插件機制。所謂插件機制。就是我們定義

Android小例子:使用反射機制讀取圖片制作一個圖片瀏覽器

onclick lac protected blank pri tar lec 存儲 current 效果圖:                                 工程文件夾:   該例子可供於新手參考練習,如果有哪裏不對的地方,望指正>-< 《

Java反射機制能夠獲取的信息,與應用

rri 代理 pan [] reflect 語言 子類 list tro 一、什麽是Java反射機制? 【1】反射機制是在運行狀態中,對於任何一個類,都能夠知道這個類的所有屬性和方法; 【2】對於任意一個對象,都能夠調用它的任意一個屬性和方法; 像這種動態獲取類的信

C++反射機制:可變參數模板實現C++反射

https dcm ESS 容易出錯 指定 ring 人員 時間處理 emp 1. 概要   本文描述一個通過C++可變參數模板實現C++反射機制的方法。該方法非常實用,在Nebula高性能網絡框架中大量應用,實現了非常強大的動態加載動態創建功能。Neb

C++反射機制:可變參數OA信用盤平臺搭建模板實現C++反射

github () 簡單的 同學 多重繼承 是什麽 定義 通用 插件 概要OA信用盤平臺搭建Q1446595067 ??本文描述一個通過C++可變參數模板實現C++反射機制的方法。該方法非常實用,在Nebula高性能網絡框架中大量應用,實現了非常強大的動態加載動態創建功能。

c# 反射機制的基本瞭解

        1.反射機制的簡單介紹                      反射機

Python中如何獲取屬性的列表

前言 最近工作中遇到個需求是要得到一個類的靜態屬性,也就是說有個類 Type ,我要動態獲取 Type.FTE 這個屬性的值。 最簡單的方案有兩個: ? 1 2 getattr(Type, 'FTE') Type.__dic

反射機制與Class

  從這節課開始, 我們正式進入java 反射機制的學習     首先,什麼是java的反射機制?來看百度百科: 重點: 在執行狀態中 對任意一個實體類 對任意一個物件 動態獲取資訊 動態呼叫物件方法 &

java反射機制和Class

面向物件思想 一切皆物件 類也是物件,Class類的物件,java.lang.Class Class類的構造器是私有的,只有虛擬機器可以直接建立它的物件, 有三種建立方式:類.class、類物件.getClass、Class.forName 靜態載入:new,發生在編譯的時候 動態載

python 學習彙總63:獲取屬性的列表(初級學習- tcy)

獲取類屬性的列表 2018/11/20 ====================================================================== 1.類屬性: getattr(Type, 'FTE'); type.__dict__['FTE'] ===

利用反射機制建立工具對資料進行加密和解密

對資料庫的資料進行加密,包括使用者資料、專案資料、聊天資料等,需要在插入表的的時候進行加密,查詢的時候進行解密。利用java的反射機制,建立以下工具類,對資料進行加解密。 public class CryptoUtil { /** * 加密、解密方法 * @param ob