Attribute 類被稱為特性.是一種可由用戶自由定義的修飾符(Modifier),可以用來修飾各種需要被修飾的目標。可以修飾類,接口,屬性,方法等.它不同於注釋,注釋在程序被編譯的時候會被編譯器所丟棄,因此,它絲毫不會影響到程序的執行.而Attribute是程序代碼的一部分,不但不會被編譯器丟棄,而且還會被編譯器編譯進程序(Assembly)的元數據(Metadata)裡,在程序運行的時候,你隨時可以從元數據裡提取出這些附加信息來決策程序的運行。
Framework中我們有時候調用方法,會提示我們該方法已經過時,被某某方法替代,這就是Attribute很用一個用處.
做一個對自定義類型進行修飾的Attribute
所有自定義的Attribute必須從Attribute派生 通過AttributeUsage的Attribute限定自己所施加元素的類型AttributeUsage的參數有三個
該屬性可以自定Attribute放在那些元素上,默認是所有的,all,可以操作的元素有類,集合,接口,字段,屬性,方法,事件等。
[AttributeUsage((AttributeTargets)4, AllowMultiple = false, Inherited = false )],4代表就是“class”元素,其它諸如1代表“assembly”,16383代表“all”等等)或者”.”操做符綁定幾個AttributeTargets 值。(譯者注:默認值為AttributeTargets.All)
該屬性標識我們的自定義attribte能在同一語言元素上使用多次。(譯者注:該屬性為bool類型,默認值為false,意思就是該自定義attribute在同一語言元素上只能使用一次)
該屬性來控制我們的自定義attribute類的繼承規則。該屬性標識我們的自定義attribute是否可以由派生類繼承,默認是false
下面我們做一個小例子
namespace Attribute1 { classProgram { staticvoid Main(string[] args) { //typeof操作符得到了一個與我們AnyClass類相關聯的Type型對象 //通過反射得到Student類的信息,也可以定義Type類 //Typeinfo= typeof(Studnet) System.Reflection.MemberInfoinof = typeof(Student); Hobbyhobbyattr = (Hobby)Attribute.GetCustomAttribute(inof, typeof(Hobby)); if(hobbyattr != null) { //得到我們對類的描述信息,基本的用法 Console.WriteLine("類名:{0}", inof.Name); Console.WriteLine("興趣類型:{0}", hobbyattr.Type); Console.WriteLine("興趣指數:{0}", hobbyattr.Level); } } } [Hobby("Sports",Level=5)] classStudent { publicstring profession; publicstring Profession { get{ return profession; } set{ profession = value; } } } [AttributeUsage(AttributeTargets.All,AllowMultiple=false,Inherited=true)] classHobby : Attribute { publicHobby(string _type) { this.type= _type; } //興趣類型 privatestring type; publicstring Type { get{ return type; } set{ type = value; } } //興趣指數 privateint level; publicint Level { get{ return level; } set{ level = value; } } } }
Attribute的用法很廣,這裡只是初始的說了一個開端,對於它的更深處的用法,可以用作校驗器,對底層數據的校驗有很好的作用。