C# 程式中的類型、成員和其他實體支持使用修飾符來控制其行為的某些方面。 例如,方法的可訪問性是由 public、protected、internal 和 private 修飾符控制。 C# 整合了這種能力,以便可以將用戶定義類型的聲明性信息附加到程式實體,併在運行時檢索此類信息。 程式通過定義和使 ...
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();
運行結果如下: