一.什么是Attribute编程
先看下面的三段代码:安全
1.自定义Attribute类:VersionAttribute工具
- [AttributeUsage(AttributeTargets.Class)]
- public class VersionAttribute : Attribute
- {
- public string Name { get; set; }
- public string Date { get; set; }
- public string Describtion { get; set; }
- }
2.使用自定义Attribute的Class:.net
- [Version(Name = "hyddd", Date = "2009-07-20", Describtion = "hyddd's class")]
- public class MyCode
- {
- //...
- }
3.上面这个Class中的Attribute通常会被如何使用呢?翻译
- class Program
- {
- static void Main(string[] args)
- {
- var info = typeof(MyCode);
- var classAttribute = (VersionAttribute)Attribute.GetCustomAttribute(info, typeof(VersionAttribute));
- Console.WriteLine(classAttribute.Name);
- Console.WriteLine(classAttribute.Date);
- Console.WriteLine(classAttribute.Describtion);
- }
- }
示例完毕!上面三段代码相信已经说明了Attribute大概是一个什么东西和怎么去用。设计
二.深刻讨论Attributecode
1.Attribute的概念定义htm
关于Attribute概念的定义,我直接引用《你必须知道的.NET之特性和属性》中的一段来讲明:对象
MADN的定义为:公共语言运行时容许添加相似关键字的描述声明,叫作attributes, 它对程序中的元素进行标注,如类型、字段、方法和属性等。Attributes和Microsoft .NET Framework文件的元数据(metadata)保存在一块儿,能够用来向运行时描述你的代码,或者在程序运行的时候影响应用程序的行为。blog
咱们简单的总结为:定制特性attribute,本质上是一个类,其为目标元素提供关联附加信息,并在运行期以反射的方式来获取附加信息。
噢,原来Attribute的目的是为元素提供关联附加信息。其中,上面第一段代码中“[AttributeUsage(AttributeTargets.Class)] ”说明了Attribute提供附加信息的元素是Class,因此若是上面第二段的代码改成:
- public class MyCode
- {
- [Version(Name = "hyddd", Date = "2009-07-20", Describtion = "hyddd's class")]
- public void Test() { }
- }
会出现编译错误。
2.Attribute做为编译指令
Attribute类是在编译的时候被实例化的,而不是像一般的类那样在运行时候才实例化。因此在第三段代码中,你能够在没有实例化MyCode对象的状况下取到MyCode的Attribute信息。因为Attribute类是在编译的时候被实例化的,因此你还能够用外部工具维护这些Attribute信息。
3.Attribute与Property
从中文来讲,Attribute和Property的中文都叫“属性”,很容易让人混淆。如今的文章,Attribute通常翻译为”特性”,而Property称为“属性”。
或许你会问,我用静态的Property/Field同样能够作到在不实例化的时候拿到一些信息,若是这样的话,Attribute又有什么存在乎义呢?
1.Property:
Property能够说是一个面向对象的概念,提供了对私有字段的访问封装,在C#中以get和set访问器方法实现对可读可写属性的操做,提供了安全和灵活的数据访问封装。好比:
- public class Robot
- {
- private string name = ""; //字段:Field
- public string Name //属性:Property,对Field进行封装。
- {
- get { return name; }
- set { name = value; }
- }
- }
2.Attribute:
Attribute的目标是:为元素提供附加信息。它的做用更相似于注释。
能够说,Property/Field和Attribute是两个彻底不一样的概念,虽然他们有些时候能作同样的事,但请记住,他们是从本质上就不一样的两个东西。
三.实现本身的Attribute时须要注意的一些问题
1.自定义的Attribute必须直接或者间接继承System.Attribute。
2.这里有一个约定:全部自定义的特性名称都应该有个Attribute后缀。由于当你的Attribute施加到一个程序的元素上的时候,编译器先查找你的Attribute的定义,若是没有找到,那么它就会查找“Attribute名称"+Attribute的定义。若是都没有找到,那么编译器就报错。这就是为何我能够再上面第一段代码中,定义一个VersionAttribute,但在第二段代码中,我使用倒是Version这个Attribute。:>
下面是一些开发自定义Attribute时,可能须要用到的资料:
【1】Attribute能够关联的元素包括:
程序集(assembly)、模块(module)、类型(type)、属性(property)、事件(event)、字段(field)、方法(method)、参数(param)、返回值(return)。例如:
- [assembly: Version(Name = "hyddd", Date = "2009-07-20", Describtion = "hyddd's class")]
- public class MyCode
- {
- //......
- }
用指定的前缀来表示特性所应用的目标元素,建议这样来处理,由于显式处理能够消除可能带来的二义性。
【2】AttributeTargets目标包括:
【3】AttributeUsageAttribute中的3个属性(Property)说明:
四.参考资料
【1】Msdn
【2】《你必须知道的.NET之特性和属性》,博主严重推荐!
【3】《Attribute在.net编程中的应用》系列文章
【编辑推荐】
【责任编辑:王苑 TEL:(010)68476606】