特性Attribute
1.Attribute介紹 ??
我們用VS進行編程時,智能提示再提供方法和屬性列表的時候,有時會有下面的這種情況:
提示某個方法已經是過時的了,還會給與提示信息。出現此效果就是Attribute(特性)的功勞了。? ? 特性是一種特殊的類型,可以加載到程序集或者程序集中的類型上,這些類型包括模塊、類、接口、結構、構造函數、方法、方法參數等,加載了特性的類型稱作特性的目標。特性是為程序集添加元數據(描述數據的數據)的一種機制,通過它可以為編譯器提供指示或者對數據的說明。
2.Attribute的使用
? ? Attribute在特性目標上使用構成如下圖:
[]后緊跟的就是Attribute的名稱,()內可以傳遞構造函數需要傳進的參數以及給屬性賦值的參數。下面是obsoleteAttribute的定義
// 摘要:// 標記不再使用的程序元素。無法繼承此類。 [Serializable][ComVisible(true)][AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum | AttributeTargets.Constructor | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Interface | AttributeTargets.Delegate, Inherited = false)]public sealed class ObsoleteAttribute : Attribute{// 摘要:// 使用默認屬性初始化 System.ObsoleteAttribute 類的新實例。public ObsoleteAttribute();//// 摘要:// 使用指定的變通方法消息初始化 System.ObsoleteAttribute 類的新實例。//// 參數:// message:// 描述可選的變通方法的文本字符串。public ObsoleteAttribute(string message);//// 摘要:// 使用變通方法消息和布爾值初始化 System.ObsoleteAttribute 類的新實例,該布爾值指示是否將使用已過時的元素視為錯誤。//// 參數:// message:// 描述可選的變通方法的文本字符串。//// error:// 指示是否將使用已過時的元素視為錯誤的布爾值。public ObsoleteAttribute(string message, bool error);// 摘要:// 獲取指示編譯器是否將使用已過時的程序元素視為錯誤的布爾值。//// 返回結果:// 如果將使用已過時的元素視為錯誤,則為 true;否則為 false。默認為 false。public bool IsError { get; }//// 摘要:// 獲取變通方法消息,包括對可選程序元素的說明。//// 返回結果:// 變通方法文本字符串。public string Message { get; }}特性目標應用了特性后,編譯時會提示
?
3.自定義Attribute
?? 仿照Obsolete屬性,可以自己定義一個Attribute。自定義的Attribute就是個普通的類,只是實現了Attribute抽象類。不管是構造函數的參數還是屬性,全部寫到構造函數的圓括號中,對于構造函數的參數,必須采取構造函數參數的順序和類型,因此叫做位置參
數;對于屬性,采用“屬性=值”這樣的格式,它們之間用逗號分隔,稱作命名參數。命名參數是可選擇輸入的。
?? AttributeUsage特性的構造函數接受一個AttributeTargets類型的參數,它定義了特性可以應用的類型,AttributeTargets也是一個位標記。
???
// 摘要: // 指定可以對它們應用特性的應用程序元素。 [Serializable][ComVisible(true)][Flags]public enum AttributeTargets{// 摘要: // 可以對程序集應用屬性。Assembly = 1,//// 摘要: // 可以對模塊應用屬性。Module = 2,//// 摘要: // 可以對類應用屬性。Class = 4,//// 摘要: // 可以對結構應用屬性,即值類型。Struct = 8,//// 摘要: // 可以對枚舉應用屬性。Enum = 16,//// 摘要: // 可以對構造函數應用屬性。Constructor = 32,//// 摘要: // 可以對方法應用屬性。Method = 64,//// 摘要: // 可以對屬性 (Property) 應用屬性 (Attribute)。Property = 128,//// 摘要: // 可以對字段應用屬性。Field = 256,//// 摘要: // 可以對事件應用屬性。Event = 512,//// 摘要: // 可以對接口應用屬性。Interface = 1024,//// 摘要: // 可以對參數應用屬性。Parameter = 2048,//// 摘要: // 可以對委托應用屬性。Delegate = 4096,//// 摘要: // 可以對返回值應用屬性。ReturnValue = 8192,//// 摘要: // 可以對泛型參數應用屬性。GenericParameter = 16384,//// 摘要: // 可以對任何應用程序元素應用屬性。All = 32767,}AllowMutiple屬性用于設置該特性是不是可以重復地添加到一個類型上(默認為false),如下:
[My("messageOne",OtherInfo = "OtherInfoOne")][My("messageTwo",OtherInfo = "OtherInfoTwo")]public class DemoClass{//todo:}如果將Inherited設置為True,當有一個類繼承自FatherClass時,則FatherClass的子類也會獲得該特性。而當將特性應用于一個方法,如果繼承自該類的子類覆蓋了這個方法,那么子類中的方法也將繼承這個特性,一般我們設置為false。
則自定義的屬性代碼如下:
[AttributeUsage(AttributeTargets.All,AllowMultiple = true,Inherited = false)]public class MyAttribute : Attribute{private string message;//位置參數public MyAttribute(string msg){this.message = msg;}public string Message {get{return message;}}public string OtherInfo { get; set; }//命名參數}使用方式同普通的Attribute。
4.反射查看自定義的Attribute
?? 可以通過Type.GetCustomerAttributes獲取到對象所使用自定義得屬性,當指定GetCustomAttributes() 方法的第一個參數attributeType時,將只返回該類型的特性,否則將返回全部特性示例代碼如下:
public class Program{static void Main(string[] args){Type t = typeof (DemoClass);object[] allAttributes = t.GetCustomAttributes(typeof (MyAttribute), false);//獲取所有自定義特性foreach (MyAttribute myAttribute in allAttributes){Console.WriteLine("Message:"+myAttribute.Message+" OtherInfo:"+myAttribute.OtherInfo+"\n");}Console.ReadKey();}}執行的結果為:
?
轉載于:https://www.cnblogs.com/yanglaosan/p/6687460.html
總結
以上是生活随笔為你收集整理的特性Attribute的全部內容,希望文章能夠幫你解決所遇到的問題。