日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

特性Attribute

發(fā)布時間:2023/12/1 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 特性Attribute 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1.Attribute介紹 ??

我們用VS進行編程時,智能提示再提供方法和屬性列表的時候,有時會有下面的這種情況:

提示某個方法已經(jīng)是過時的了,還會給與提示信息。出現(xiàn)此效果就是Attribute(特性)的功勞了。? ? 特性是一種特殊的類型,可以加載到程序集或者程序集中的類型上,這些類型包括模塊、類、接口、結(jié)構(gòu)、構(gòu)造函數(shù)、方法、方法參數(shù)等,加載了特性的類型稱作特性的目標。特性是為程序集添加元數(shù)據(jù)(描述數(shù)據(jù)的數(shù)據(jù))的一種機制,通過它可以為編譯器提供指示或者對數(shù)據(jù)的說明。

2.Attribute的使用

? ? Attribute在特性目標上使用構(gòu)成如下圖:

[]后緊跟的就是Attribute的名稱,()內(nèi)可以傳遞構(gòu)造函數(shù)需要傳進的參數(shù)以及給屬性賦值的參數(shù)。下面是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 類的新實例。//// 參數(shù):// message:// 描述可選的變通方法的文本字符串。public ObsoleteAttribute(string message);//// 摘要:// 使用變通方法消息和布爾值初始化 System.ObsoleteAttribute 類的新實例,該布爾值指示是否將使用已過時的元素視為錯誤。//// 參數(shù):// message:// 描述可選的變通方法的文本字符串。//// error:// 指示是否將使用已過時的元素視為錯誤的布爾值。public ObsoleteAttribute(string message, bool error);// 摘要:// 獲取指示編譯器是否將使用已過時的程序元素視為錯誤的布爾值。//// 返回結(jié)果:// 如果將使用已過時的元素視為錯誤,則為 true;否則為 false。默認為 false。public bool IsError { get; }//// 摘要:// 獲取變通方法消息,包括對可選程序元素的說明。//// 返回結(jié)果:// 變通方法文本字符串。public string Message { get; }}

特性目標應用了特性后,編譯時會提示

?

3.自定義Attribute

?? 仿照Obsolete屬性,可以自己定義一個Attribute。自定義的Attribute就是個普通的類,只是實現(xiàn)了Attribute抽象類。不管是構(gòu)造函數(shù)的參數(shù)還是屬性,全部寫到構(gòu)造函數(shù)的圓括號中,對于構(gòu)造函數(shù)的參數(shù),必須采取構(gòu)造函數(shù)參數(shù)的順序和類型,因此叫做位置參
數(shù);對于屬性,采用“屬性=值”這樣的格式,它們之間用逗號分隔,稱作命名參數(shù)。命名參數(shù)是可選擇輸入的。

?? AttributeUsage特性的構(gòu)造函數(shù)接受一個AttributeTargets類型的參數(shù),它定義了特性可以應用的類型,AttributeTargets也是一個位標記。

???

// 摘要: // 指定可以對它們應用特性的應用程序元素。 [Serializable][ComVisible(true)][Flags]public enum AttributeTargets{// 摘要: // 可以對程序集應用屬性。Assembly = 1,//// 摘要: // 可以對模塊應用屬性。Module = 2,//// 摘要: // 可以對類應用屬性。Class = 4,//// 摘要: // 可以對結(jié)構(gòu)應用屬性,即值類型。Struct = 8,//// 摘要: // 可以對枚舉應用屬性。Enum = 16,//// 摘要: // 可以對構(gòu)造函數(shù)應用屬性。Constructor = 32,//// 摘要: // 可以對方法應用屬性。Method = 64,//// 摘要: // 可以對屬性 (Property) 應用屬性 (Attribute)。Property = 128,//// 摘要: // 可以對字段應用屬性。Field = 256,//// 摘要: // 可以對事件應用屬性。Event = 512,//// 摘要: // 可以對接口應用屬性。Interface = 1024,//// 摘要: // 可以對參數(shù)應用屬性。Parameter = 2048,//// 摘要: // 可以對委托應用屬性。Delegate = 4096,//// 摘要: // 可以對返回值應用屬性。ReturnValue = 8192,//// 摘要: // 可以對泛型參數(shù)應用屬性。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;//位置參數(shù)public MyAttribute(string msg){this.message = msg;}public string Message {get{return message;}}public string OtherInfo { get; set; }//命名參數(shù)}

使用方式同普通的Attribute。

4.反射查看自定義的Attribute

?? 可以通過Type.GetCustomerAttributes獲取到對象所使用自定義得屬性,當指定GetCustomAttributes() 方法的第一個參數(shù)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();}}

執(zhí)行的結(jié)果為:

?

轉(zhuǎn)載于:https://www.cnblogs.com/yanglaosan/p/6687460.html

總結(jié)

以上是生活随笔為你收集整理的特性Attribute的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。