Attribute(特性):
“Attribute类将将与目标元素相关联的预定义的系统信息或用户定义的自定义信息。 目标元素可以是程序集、 类、 构造函数、 委托、 枚举、 事件、 字段、 接口、 方法、 可移植可执行文件的模块、 参数、 属性、 返回值、 结构或另一个属性。
所提供的属性信息也称为是元数据。 元数据可以由你的应用程序来控制应用程序如何处理数据,检查在运行时或之前运行时由外部工具来控制如何在应用程序本身进行处理或维护。”——docs.microsoft.com
通俗的来说,就是在开发时,你可以为类、方法等指定一些信息,在程序运行时来控制程序处理这些信息。
[Obsolete("已经过时了",false)]
public void OldFunc()
{
//DO SOME THING
}
上面的代码就是最常见的特性的使用。
当我们要定义自己的特性的时候,如下代码:
//AttributeTargets是个枚举值,例如Class,是对类进行声明,Enum 是对枚举进行声明,All 对所有对象声明
//AllowMultiple 当为false时,在使用这个特性时,同一个类只能使用一次,当AllowMultiple为True是,这个特性可以被使用多次。
//Inherited 比如一个A类使用了某个特性,B类继承了A类,那么B类会不会继承A类的特性,由这个属性Inherited进行控制,false 不被继承,true被继承。
[AttributeUsage(AttributeTargets.Class,AllowMultiple=false,Inherited=false)]
public class MsgAttribute : Attribute
{
public string title;
public string content;
public readonly string param;
public MsgAttribute(string _param)
{
this.param = _param;
}
public MsgAttribute()
{
}
public string DoSomeThing()
{
return "我是特性里面的方法。"+this.param;
}
}
[Msg("我是传入特性类构造函数的参数", title = "这是一个加了特性的类", content = "这个类演示特性的作用")]
//[Msg("当特性 AllowMultiple =True 时,我才能被声明两次", title = "这是一个加了特性的类", content = "这个类演示特性的作用")]
public class MyClass
{
public void getAttr()
{
var AttrObj = (MsgAttribute)Attribute.GetCustomAttribute(this.GetType(), typeof(MsgAttribute));
Console.WriteLine(AttrObj.param);
Console.WriteLine(AttrObj.DoSomeThing());
}
}
特性类在创建的时候名称后面一定要有Attribute,继承Attribute。
AttributeUsage:指定一个特性类的用法。
AttributeTargets:是个枚举值,例如Class,是对类进行声明,Enum 是对枚举进行声明,All 对所有对象声明
AllowMultiple:当为false时,在使用这个特性时,同一个类只能使用一次,当AllowMultiple为True是,这个特性可以被使用多次。
Inherited:官方定义:该值确定指示的属性是否由派生类和重写成员继承。如果你看不懂的话,用通俗的话来说,比如一个A类使用了某个特性,B类继承了A类,那么B类会不会继承A类的特性,由这个属性Inherited进行控制,false 不被继承,true被继承。