.Net的特性(attribute)

特性本質上是一個類,其爲目標元素提供關聯附加信息,並在運行期以反射的方式來獲取附加信息;(attribute和.net framework 文件的元數據保存在一塊兒,能夠用來在運行時描述你的代碼,或者在程序運行的時候影響應用程序的行爲)所謂的定製特性就是爲目標元素,能夠是數據集,類,方法,屬性,相似於註釋,可是能夠在運行期以反射的方式得到,定製特性主要應用在序列化,編譯器指令,設計模式等方面;c#

目標元素包括:assembly   module   type  property   event   field   method   param   return
(其實關於數組來接受任意長度的參數就是用特性來作出來的)
其在編譯期進行初始化而不是運行期;設計模式


幾個習慣用法:
 自定義特性必須直接或間接繼承自System.Attribute類並且該類必需要有公有的構造函數;
 自定義特性應該有一個Attribute後綴,習慣約定(在調用中能夠省略,會自動匹配);
 非抽象特性必需要有public訪問權限;
 定製特性不會影響應用元素的任何功能,只是約定了該元素具備的特質;數組


若是沒有什麼機制在運行期獲取attribute的附加信息,那麼attribute就沒有什麼存在的意義,所以 .net中用反射的機制來實如今運行期獲取attribute信息;函數


 [AttributeUsage(AttributeTargets.Class |
        AttributeTargets.Method,AllowMultiple =true , Inherited = true)] (可應用屢次,不能夠繼承到派生類)
    public class testAttribute : System.Attribute
    {
        public  string name;
        public testAttribute()
        { }
    }
    [test(name ="itis my first program")]
    public class mytext
    {
        public void ok()
        {
            Console.WriteLine("my text word!");
        }
    }
    class Program
    {
       
        static void Main(string[] args)
        {
            MemberInfo info = typeof(mytext);           //或者對象名.GetType() 獲得的其實是Type類型;
            object []attribute;
            attribute =info.GetCustomAttributes(typeof(testAttribute), true);
            foreach (object a in attribute)
            {
                testAttribute x = (testAttribute)a;
                Console.WriteLine(x.name );
            }                                                                     //獲取對象的屬性
(其實就是人爲付在類體上面的一些說明);.net

            Assembly d = Assembly.Load("Mscorlib");
            Type[] types = d.GetTypes();
            int i = 0;
            foreach (Type a in types)
            {
                Console.WriteLine(a);
                Console.Read();
                i++;
            }
            Console.WriteLine(i.ToString ());                                   //查看一個程序集的內容設計

關於Type:
能夠看做是一個類,但實際上時一個抽象的基類,type於每種數據類型都有對應的Type的派生類,通常派生的類只提供各類Tyep方法和屬性的不一樣重載,以返回對應數據類型的正確數據
獲取指向給定類型的Type引用由3種方式:
·使用c#typeof運算符,參數是類型的名稱;
·使用GetType()方法,全部類都會從object類中繼承這個方法;(肯定該實例的類型)
·調用Type類的靜態方法GetType();對象

type是許多反射技術的入口,可用的屬性都是可讀的,可使用Type肯定數據的類型,但不能修改該類型;
(整個反射機制的樞紐)繼承

反射機制:
第一步:Assembly.Load("")/.LoadFrom("") 加載程序集;
第二步:   a.調用.GetTypes(),返回全部該程序集中的類型;
 b.或者調用特性靜態方法Attribute.GetCustomAttributes(Assemble x) ,返回該程序集中全部包含的特性
 (有一個重載的方法,第二個參數爲指定特性的Type,即返回該程序集全部的該特性的集合)
第三步:   a.調用Type的各類屬性,如GetMethods()等,查找制定方法字段屬性的 信息;
 b.將特性轉換爲(顯示)已知的特性,再調用特性的方法等;
第四步:用methodinfo 等直接調用GetCustomAttributes ()以得到與該方法有關的特性;ip

相關文章
相關標籤/搜索