首页 > 代码库 > C#自定义Attribute

C#自定义Attribute

       Attribute类被称为特性.是一种可由用户自由定义的修饰符(Modifier),可以用来修饰各种需要被修饰的目标。可以修饰类,接口,属性,方法等.它不同于注释,注释在程序被编译的时候会被编译器所丢弃,因此,它丝毫不会影响到程序的执行.Attribute是程序代码的一部分,不但不会被编译器丢弃,而且还会被编译器编译进程序(Assembly)的元数据(Metadata)里,在程序运行的时候,你随时可以从元数据里提取出这些附加信息来决策程序的运行。


Framework中我们有时候调用方法,会提示我们该方法已经过时,被某某方法替代,这就是Attribute很用一个用处.

 

自定义Attribute

 

做一个对自定义类型进行修饰的Attribute

  • 所有自定义的Attribute必须从Attribute派生
  •  通过AttributeUsageAttribute限定自己所施加元素的类型

AttributeUsage的参数有三个

 

ValidOn

 该属性可以自定Attribute放在那些元素上,默认是所有的,all,可以操作的元素有类,集合,接口,字段,属性,方法,事件等。

[AttributeUsage((AttributeTargets)4, AllowMultiple = false, Inherited = false )],4代表就是“class”元素,其它诸如1代表“assembly”,16383代表“all”等等)或者”.”操做符绑定几个AttributeTargets 值。(译者注:默认值为AttributeTargets.All)

AllowMultiple

该属性标识我们的自定义attribte能在同一语言元素上使用多次。(译者注:该属性为bool类型,默认值为false,意思就是该自定义attribute在同一语言元素上只能使用一次


Inherited

该属性来控制我们的自定义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的用法很广,这里只是初始的说了一个开端,对于它的更深处的用法,可以用作校验器,对底层数据的校验有很好的作用。