C# 程式中的型別、成員和其他物體支持使用修飾符來控制其行為的某些方面, 例如,方法的可訪問性是由 public、protected、internal 和 private 修飾符控制, C# 整合了這種能力,以便可以將用戶定義型別的宣告性資訊附加到程式物體,并在運行時檢索此類資訊, 程式通過定義和使用特性來指定此類額外的宣告性資訊,
以下示例宣告了 HelpAttribute 特性,可將其附加到程式物體,以提供指向關聯檔案的鏈接,
public class HelpAttribute : Attribute { string url; string topic; public HelpAttribute(string url) { this.url = url; } public string Url => url; public string Topic { get { return topic; } set { topic = value; } } }
所有特性類都派生自標準庫提供的 Attribute 基類, 特性的應用方式為,在相關宣告前的方括號內指定特性的名稱以及任意自變數, 如果特性的名稱以 Attribute 結尾,那么可以在參考特性時省略這部分名稱, 例如,可按如下方法使用 HelpAttribute,
[Help("https://www.cnblogs.com/taotaozhuanyong/")] public class Widget { [Help("https://www.cnblogs.com/taotaozhuanyong/", Topic = "Display")] public void Display(string text) { } }
此示例將 HelpAttribute 附加到 Widget 類, 還向此類中的 Display 方法附加了另一個 HelpAttribute, 特性類的公共建構式控制了將特性附加到程式物體時必須提供的資訊, 可以通過參考特性類的公共讀寫屬性(如上面示例對 Topic 屬性的參考),提供其他資訊,
可以在運行時使用反射來讀取和操縱特性定義的元資料, 如果使用這種方法請求獲取特定特性,便會呼叫特性類的建構式(在程式源中提供資訊),并回傳生成的特性實體, 如果是通過屬性提供其他資訊,那么在特性實體回傳前,這些屬性會設定為給定值,
下面的代碼示例展示了如何獲取與 Widget 類及其 Display 方法相關聯的 HelpAttribute 實體,
Type widgetType = typeof(Widget); //獲取為小部件型別定義的每個helpattribute, var widgetClassAttributes = widgetType.GetCustomAttributes(typeof(HelpAttribute), false); if (widgetClassAttributes.Length > 0) { var attr = (HelpAttribute)widgetClassAttributes[0]; Console.WriteLine($"Widget class help URL:{attr.Url}-Related topic :{attr.Topic}"); } MethodInfo displayMethod = widgetType.GetMethod(nameof(Widget.Display)); //獲取為widget.display方法定義的每個helpattribute, var displayMethodAttributes = displayMethod.GetCustomAttributes(typeof(HelpAttribute), false); if (displayMethodAttributes.Length > 0) { var attr = (HelpAttribute)displayMethodAttributes[0]; Console.WriteLine($"Display method help URL : {attr.Url} - Related topic : {attr.Topic}"); } Console.ReadLine();
運行結果如下:

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/114250.html
標籤:C#
