AttributeUsageAttribute自定義特性屬性說明

要設計本身的自定義屬性,沒必要掌握許多新的概念。若是熟悉面向對象的編程,而且知道如何設計類,就已具有了所需的大部分知識。自定義屬性本質上是直接或間接地從 System.Attribute 派生的傳統類。與傳統類同樣,自定義屬性也包含存儲和檢索數據的方法。 正確設計自定義屬性類的主要步驟以下: 應用 AttributeUsageAttribut
  

  要設計本身的自定義屬性,沒必要掌握許多新的概念。若是熟悉面向對象的編程,而且知道如何設計類,就已具有了所需的大部分知識。自定義屬性本質上是直接或間接地從 System.Attribute 派生的傳統類。與傳統類同樣,自定義屬性也包含存儲和檢索數據的方法。html

  正確設計自定義屬性類的主要步驟以下:jquery

  應用 AttributeUsageAttribute程序員

  聲明屬性類編程

  聲明構造函數app

  聲明屬性ide

  本節描述上述每一個步驟,並以自定義屬性示例結束。函數

  應用 AttributeUsageAttributeui

  自定義屬性聲明以 AttributeUsageAttribute 開始,而該屬性定義屬性類的一些主要屬性。例如,可指定屬性是否可被其餘類繼承,或指定屬性可應用到哪些元素。下列代碼段說明了如何使用 AttributeUsageAttribute。this

  [AttributeUsage(AttributeTargets.All, Inherited = false, AllowMultiple = true)]spa

  System.AttributeUsageAttribute 類包含三個對自定義屬性的建立具備重要意義的成員:AttributeTargets、Inherited 和 AllowMultiple。

  AttributeTargets 成員

  在前面的示例中指定了 AttributeTargets.All,指示該屬性能夠應用到全部程序元素。還能夠指定 AttributeTargets.Class,指示屬性只能夠應用於某個類;或指定 AttributeTargets.Method,指示屬性只能夠應用於某個方法。全部程序元素均可經過這種方式由自定義屬性標記,以便對其進行描述。

  還可傳遞 AttributeTargets 的多個實例。下列代碼段指定自定義屬性可應用到任何類或方法。

  [AttributeUsage (AttributeTargets.Class | AttributeTargets.Method)]

  繼承屬性

  Inherited 屬性指示屬性是否可由從該屬性應用到的類派生的類繼承。該屬性採用 true(默認值)或 false 標誌。例如,在下面的代碼示例中,MyAttribute 的默認 Inherited 值爲 true,而 YourAttribute 的 Inherited 值爲 false。

1
2
3
4
5
6
7
8
9
//This defaults to Inherited = true.
public class MyAttribute :Attribute
{
}

[AttributeUsage( Inherited = false)]
public class YourAttribute : Attribute
{
}

  而後,這兩個屬性應用到基類 MyClass 中的某個方法。

1
2
3
4
5
6
7
8
9
public class MyClass
{
    [MyAttribute]
    [YourAttribute]
    public virtual void MyMethod() 
    {
        //...
    }
}

  最後,YourClass 類從基類 MyClass 繼承。方法 MyMethod 顯示 MyAttribute,而不是 YourAttribute。

1
2
3
4
5
6
7
8
9
public class YourClass: MyClass
{
      //MyMethod will have MyAttribute but not YourAttribute.
      public override void MyMethod()
      {
         //...
      }

}

  AllowMultiple 屬性

  AllowMultiple 屬性指示元素中是否可存在屬性的多個實例。若是設置爲 true,則容許存在多個實例;若是設置爲 false(默認值),則只容許存在一個實例。

  在下面的代碼示例中,MyAttribute 的默認 AllowMultiple 值爲 false,而 YourAttribute 的對應值爲 true。

1
2
3
4
5
6
7
8
9
//This defaults to AllowMultiple = false.
public class MyAttribute :Attribute
{
}

[AttributeUsage(AllowMultiple = true)]
public class YourAttribute : Attribute
{
}

  當應用這些屬性的多個實例時,MyAttribute 將生成編譯器錯誤。下面的代碼示例顯示 YourAttribute 的有效用法和 MyAttribute 的無效用法。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
public class MyClass
{
    //This produces an error.
    //Duplicates are not allowed.
    [MyAttribute]
    [MyAttribute]
    public void MyMethod() {
        //...
    }

    //This is valid.
    [YourAttribute]
    [YourAttribute]
    public void YourMethod(){
    //...
    }
}

  若是 AllowMultiple 屬性和 Inherited 屬性都設置爲 true,則從另外一個類繼承的類能夠繼承一個屬性,並在同一子類中應用同一屬性的另外一個實例。若是 AllowMultiple 設置爲 false,則父類中的全部屬性值將被子類中同一屬性的新實例重寫。

  聲明屬性類

  應用了 AttributeUsageAttribute 後,能夠開始定義屬性細節。屬性類的聲明與傳統類的聲明相似,以下列代碼所示:

1
public class MyAttribute : System.Attribute {    // . . . }

  此屬性定義說明了下列幾點:

  屬性類必須聲明爲公共類。

  按照約定,屬性類的名稱以單詞 Attribute 結尾。雖然並不要求這樣,但出於可讀性目的,建議採用此約定。應用屬性時,能夠選擇是否包含 Attribute 一詞。

  全部屬性類都必須直接或間接地從 System.Attribute 繼承。

  在 Microsoft Visual Basic 中,全部自定義屬性類都必須具備 AttributeUsageAttribute 屬性。

  聲明構造函數

  用構造函數初始化屬性的方法與對待傳統類的方法相同。下列代碼段闡釋了典型的屬性構造函數。該公共構造函數採用一個參數,並將其值設置爲與成員變量相等。

  public MyAttribute(bool myvalue){ this.myvalue = myvalue; }

  可重載該構造函數以適應值的不一樣組合。若是同時爲自定義屬性類定義了屬性,則在初始化屬性時可以使用命名參數和定位參數的組合。一般狀況下,將全部必選參數定義爲定位參數,將全部可選參數定義爲命名參數。在這種狀況下,若是沒有必選參數,則沒法初始化屬性。其餘全部參數都是可選參數。請注意,在 Visual Basic 中,屬性類的構造函數不該使用 ParamArray 參數。

  下面的代碼示例顯示如何使用可選參數和必選參數應用使用上例中的構造函數的屬性。它假定該屬性有一個必選布爾值和一個可選字符串屬性。

  //One required (positional) and one optional (named) parameter are applied.[MyAttribute(false, OptionalParameter = "optional data")]//One required (positional) parameter is applied.[MyAttribute(false)]

  聲明屬性

  若是須要定義命名參數,或者要提供一種容易的方法來返回由屬性存儲的值,請聲明屬性。應將屬性屬性聲明爲帶有要返回的數據類型說明的公共實體。定義將保存屬性值的變量,並將該變量與 get 方法和 set 方法關聯。下面的代碼示例說明如何在屬性中實現一個簡單的屬性。

  public bool MyProperty{ get {return this.myvalue;} set {this.myvalue = value;}}

  自定義屬性示例

  本節具體表現前面的信息,並顯示如何設計一個簡單的屬性來記錄有關代碼段做者的信息。該示例中的屬性存儲程序員的名字和級別,和關於該代碼是否已被複查過的信息。該示例使用三個私有變量存儲要保存的實際值。每一個變量用獲取和設置這些值的公共屬性表示。最後,用兩個必選參數定義構造函數。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
[AttributeUsage(AttributeTargets.All)]
public class DeveloperAttribute : System.Attribute 
{
        
    //Private fields.
    private string name;
    private string level;
    private bool reviewed;

    //This constructor defines two required parameters: name and level.

    public  DeveloperAttribute(string name,string level)
    {
        this.name = name;
        this.level = level; 
        this.reviewed = false;
    }

    //Define Name property.
    //This is a read-only attribute.
        
    public virtual string Name
    {
        get {return name;}        
    }

    //Define Level property.
    //This is a read-only attribute.
        
    public virtual string Level
    {
        get {return level;}
    }

    //Define Reviewed property. 
    //This is a read/write attribute. 

    public virtual bool Reviewed
    {
        get {return reviewed;}
    set {reviewed = value;}
    }
}

  可經過下列方法之一,使用全名 DeveloperAttribute 或使用縮寫名 Developer 來應用該屬性。

  [Developer("Joan Smith", "1")]
[Developer(
"Joan Smith", "1", Reviewed = true)]  

第一個示例顯示只用必選命名參數應用的屬性,而第二個示例顯示同時使用必選參數和可選參數應用的屬性。

  更多資料:http://msdn.microsoft.com/zh-cn/library/tw5zxet9.aspx

  具體應用:www.vadimv.com

本文來自永恆的記憶的博客,原文地址:http://www.cnblogs.com/salam/archive/2010/11/09/1872428.html

相關文章
相關標籤/搜索