爲了便於與類中屬性(
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
這樣,就能夠打印或者調用了。