先看下面的三段代码:
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:
[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概略是一个什么对象和怎么去用。
二.深入讨论Attribute
1.Attribute的观点界说
关于Attribute观点的界说,我直接引用《你必需知道的.NET之特性和属性》中的一段来说明:
MADN的界说为:大众语言运行时允许添加类似关键字的描述声明,叫做attributes, 它对措施中的元素进行标注,如类型、字段、要领和属性等。Attributes和Microsoft .NET Framework文件的元数据(metadata)生存在一起,可以用来向运行时描述你的代码,或者在措施运行的时候影响应用措施的行为。
我们简单的总结为:定制特性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 { //...... }用指定的前缀来暗示特性所应用的方针元素,建议这样来措置惩罚惩罚,因为显式措置惩罚惩罚可以消除可能带来的二义性。