特性(Attribute)的使用

爲了便於與類中屬性( property)的區分,如下Attribute都統稱爲特性。
特性出現的形式:一種是在公共語言運行庫,另外一種是本身定義的特性。主要用於向代碼中添加附加消息的自定義特性。
特性的特色:
1 屬性可向程序中添加元數據。元數據是嵌入程序中的信息,如編譯器指令或數據描述。
2 程序能夠使用反射檢查本身的元數據。
3 一般使用屬性與  COM  交互。
特性該怎麼實現呢?
方法:特性類實例化時須要放在括號「 [ ]」 中,語法:
       [attributeClass( 定位參數 1 …  命名參數 1,…)]
定位參數和命名參數稍有不一樣,定位參數爲構造函數中的參數,命名參數爲其餘的屬性字段。參數的類型有如下幾種:
1 基本數據類型中的值類型:×××,浮點類型,字符,  Bool
2 System.object, System.Type,System.string
3 )枚舉類型
4 以上任何類型的一維數組
凡是不符合以上幾種的都是錯誤的特性定義。
定義自定義特性的方式:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct,AllowMultiple=true ,Inherited =true ) ] //Author 特性性只能用於類和結構, AllowMultiple 是否容許屢次使用特性, Inherited 是否容許繼承
public class AuthorAttribute : Attribute //此處必須繼承自Attribute
 {
   private string name; 
   public double version;  //此爲命名參數
   public AuthorAttribute(string name) //構造函數定義的參數爲定位參數。
    {
     this.name = name; version = 1.0;
    }
        public string Name
       {
           get{return name;}
       }
 }
[Author(「 張三 」, version =2.0)]// 張三是 Author 的構造函數的參數, version 是字段,字段必須寫出字段名。
 class SampleClass
 {  }
以上就完成了特性的定義。
怎麼經過反射獲取特性中的字段呢,這是個頗有用的用法。
首先經過 Typeof方法得到使用特性類的類型
Type ty = typeof( SampleClass );
而後用反射就能夠獲取特性所傳遞的值了
((AuthorAttribute)(ty.GetCustomAttributes(false)[ 0 ])).name
這樣,就能夠打印或者調用了。