C#中创建自定义特性

时间:2020-12-20 03:14:22

自定义特性

特性实质上是一个类,想要构建一个用户自定义特性,只需要创建一个特性类即可。

  • 特性类的命名一般以Attribute结尾
  • 特性类需要继承自System.Attribute
  • 特性类一般声明为sealed,因为特性类一般不需要被继承
  • 特性类一般用来表示目标结构的一些状态(定义一些字段或属性,一般不定义方法)
    定义特性
[AttributeUsage(AttributeTargets.Class)]//表示该特性类可以应用到的程序结构为:类
sealed class MyTestAttribute : System.Attribute {
    public string Description {get;set;}
    public string VersionNumber {get;set;}
    public int ID {get;set;}

    public  MyTestAttribute(string des){//构造方法
        this.Description = des;
    }
}

当我们使用一个特性类时,相当于调用了这个特性类的构造方法。

//不仅通过构造方法对参数赋值,也可以通过指定属性的名字,给属性赋值,这种称为命名参数
//当自定义的特性类时,命名后面的Attribute是自动忽略掉的
[MyTest("Simple attribute!", ID = 10086)]   
class Program{
    ...

    //首先,通过typeof+类名也可以获得Type类型的对象。
    //其次,利用type对象调用GetCustomAttributes方法,可以获得该类所使用的所有特性;
    //其中,该方法的参数表示是否搜索该类所继承的父类所使用的特性,false为不搜索;
    //当我们获取这些特性时,得到的是这些特性所生成的对象,但它们不是特性类的对象;
    //返回值为一个object类型的数组,保存所有的对象。
    //因为Program类只有一个特性,因此array[0]所表示的就是MyTestAttribute特性类;
    //将array[0]转换成转化成相应的特性类的对象,通过该特性类对象就可以获得相应的字段和属性了。

    Type type = typeof(Program);
    object[] array = type.GetCustomAttributes(false);
    MyTestAttribute mytest = array[0] as MyTestAttribute;
    Console.WriteLine(mytest.Description);
    Console.WriteLine(mytest.ID);

    //输出为:
    //Simple attribute!
    //10086
}