attribute是 .net FrameWork 提出的技術,可以為自己的代碼添加注解,從而實現些特殊功能。
一. attribute功能
attribute被譯作特性,既然是特性,必然功能不一般。
1.微軟的說法
MSDN給出的attribute功能:Attribute類將預定義的系統信息或用戶定義的自定義信息與目標元素相關聯。
預定義的系統的信息也就是.net給出的系統attribute,用戶自定義的信息也就是用戶定義的attribute。目標元素呢就是指元數據的元素TypeDef(類,結構,枚舉,接口,委托),MethodDef,ParamDef,FieldDef,PropertyDef.等等。
2. 自己的看法
無論是定制的Attribute(系統),還是自定義的Attribute 其目的都是為了增強 對你目標元素的修飾。就好比public,private這種修飾符是為了控制對元數據的訪問權限。注釋是為了方便其他人閱讀理解代碼。那麼應用Attribute的場合就是當我需要對元數據進行修飾。那麼問題來了,Attribute究竟能提供什麼樣的特性,讓我們必須要使用它來修飾元數據呢
1)設置我們的Assembly信息
我們創建一個工程時,系統會自動生成一個Assemblyinfo.cs,這個文件就應用了大量了Attribute,為我們提供程序集信息
[assembly: AssemblyTitle("AttributeTest")] //名稱
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Microsoft")]//程序集公司
2)測試時經常用到的,ConitionAttribute,一個工程中需要測試的方法有很多,你把他歸為幾類,然後分別進行測試。總不能測試這類的代碼就注釋掉其他的代碼嘛。這樣做也太low了。這時候就可以利用ConitionAttribute特性
給各類代碼標示上不同的特性。然後在開頭使用#define AttributeName.想測試哪類就使用哪類Attribute名字。
eg。
工程中有兩類方法
[Conition("A")]
public void method1()
public void method2()
[Conition("B")]
public void method3()
public void method4()
然後在開頭加上#define A
這樣運行時就會只識別method1(),method2()
3)上面兩種都是系統提供的定制Attribute,那麼什麼時候使用自定義的呢
有需求的時候其他東西又實現不了的時候就可以考慮自定義Attribute了
比如說,我現在做數據庫表的實體類,這樣取數據的時候綁定到實體類,不用一個個賦值。數據庫中的列對應著實體類的屬性。在select 表時,將結果綁定到實體類,你需要遍歷實體類屬性,所以你必須確保實體類中的都是屬性而不是字段或其他什麼。那麼你如何做到這一點呢,怎麼修飾這個元數據使之一定是屬性呢:自定義attribute
[AttributeUsage(AttributeTargets.Property)]//指定目標元素只能是屬性
class RetriveFromDb : Attribute
{
}
[RetriveFromDb]
public string ID { get; set; }//是property,編譯通過
[RetriveFromDb]
public string GRADE = "98";//field,編譯不通過
本篇只解釋了Attribute功能。後續講解Attribute特點和如何使用