C#特性


C# 程序中的類型、成員和其他實體支持使用修飾符來控制其行為的某些方面。 例如,方法的可訪問性是由 publicprotectedinternal 和 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();

運行結果如下:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM