Attribute 类被称为特性.是一种可由用户自由定义的修饰符(Modifier),可以用来修饰各种需要被修饰的目标。可以修饰类,接口,属性,方法等.它不同于注释,注释在程序被编译的时候会被编译器所丢弃,因此,它丝毫不会影响到程序的执行.而Attribute是程序代码的一部分,不但不会被编译器丢弃,而且还会被编译器编译进程序(Assembly)的元数据(Metadata)里,在程序运行的时候,你随时可以从元数据里提取出这些附加信息来决策程序的运行。
Framework中我们有时候调用方法,会提示我们该方法已经过时,被某某方法替代,这就是Attribute很用一个用处.
做一个对自定义类型进行修饰的Attribute
AttributeUsage的参数有三个
该属性可以自定Attribute放在那些元素上,默认是所有的,all,可以操作的元素有类,集合,接口,字段,属性,方法,事件等。
[AttributeUsage((AttributeTargets)4, AllowMultiple = false, Inherited = false )],4代表就是“class”元素,其它诸如1代表“assembly”,16383代表“all”等等)或者”.”操做符绑定几个AttributeTargets 值。(译者注:默认值为AttributeTargets.All)
该属性标识我们的自定义attribte能在同一语言元素上使用多次。(译者注:该属性为bool类型,默认值为false,意思就是该自定义attribute在同一语言元素上只能使用一次)
该属性来控制我们的自定义attribute类的继承规则。该属性标识我们的自定义attribute是否可以由派生类继承,默认是false
下面我们做一个小例子
namespace Attribute1 { classProgram { staticvoid Main(string[] args) { //typeof操作符得到了一个与我们AnyClass类相关联的Type型对象 //通过反射得到Student类的信息,也可以定义Type类 //Typeinfo= typeof(Studnet) System.Reflection.MemberInfoinof = typeof(Student); Hobbyhobbyattr = (Hobby)Attribute.GetCustomAttribute(inof, typeof(Hobby)); if(hobbyattr != null) { //得到我们对类的描述信息,基本的用法 Console.WriteLine("类名:{0}", inof.Name); Console.WriteLine("兴趣类型:{0}", hobbyattr.Type); Console.WriteLine("兴趣指数:{0}", hobbyattr.Level); } } } [Hobby("Sports",Level=5)] classStudent { publicstring profession; publicstring Profession { get{ return profession; } set{ profession = value; } } } [AttributeUsage(AttributeTargets.All,AllowMultiple=false,Inherited=true)] classHobby : Attribute { publicHobby(string _type) { this.type= _type; } //兴趣类型 privatestring type; publicstring Type { get{ return type; } set{ type = value; } } //兴趣指数 privateint level; publicint Level { get{ return level; } set{ level = value; } } } }
Attribute的用法很广,这里只是初始的说了一个开端,对于它的更深处的用法,可以用作校验器,对底层数据的校验有很好的作用。
原文:http://blog.csdn.net/han_yankun2009/article/details/31517135