为了便于与类中属性(property)的区分,以下Attribute都统称为特性。
特性出现的形式:一种是在公共语言运行库,另一种是自己定义的特性。主要用于向代码中添加附加消息的自定义特性。
特性的特点:
1属性可向程序中添加元数据。元数据是嵌入程序中的信息,如编译器指令或数据描述。
2程序可以使用反射检查自己的元数据。
3通常使用属性与 COM 交互。
特性该怎么实现呢?
方法:特性类实例化时需要放在括号“[ ]”中,语法:
      [attributeClass(定位参数1… 命名参数1,…)]
定位参数和命名参数稍有不同,定位参数为构造函数中的参数,命名参数为其他的属性字段。参数的类型有以下几种:
1基本数据类型中的值类型:×××,浮点类型,字符, Bool
2System.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
这样,就可以打印或者调用了。