.Net Attribute特性
1.特性Attribute不能和属性Property混为一谈, 这是完全不同的两个东西.
2.特性Attribute给类或方法标识的内容, 可以在程序运行的时侯, 通过反射获取到.
例如1: .net添加的单元测试类, 里面有TestClass标识,里面的方法有TestMethod标识, 当用户想运行测试用例时, 一点按钮, 所有的测试用例类, 每个类中的测试方法就都显示在面前, 用户可以自由的选择运行哪些测试类及类中的哪些测试方法, 这是怎么做到的, 相信就是.net通过反射得到所有的TestClass标识的类, 做成一个list显示给用户, 点开这个类, 再通过反射得到所有该类中有TestMethod标识的方法, 再显示给用户, 就这样做到的.
例如2:[Obsolete("这是一个过时的方法")] 加在一个方法或类前时,编译器能提示您这是一个过时的方法,如何做到的?肯定是编译程序时要扫描方法前是否有这个标志,如果有,就给记录下来,显示出来。
3.特性Attribute这个东西类似静态的常量, 属于类所有, 不隶属于每一个特定的对象, 如果没有特性Attribute这个东西, 很多事情就很难做到.
4.内置的三个重要特性Attribute和一个枚举enum AttributeTargets
AttributeUsage
ComVisible
SerializableAttribute
后两个特性实际上代码很简单,就是一个标志, 如SerializableAttribute。
namespace System
{
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum | AttributeTargets.Delegate, Inherited = false)]
[ComVisible(true)]
public sealed class SerializableAttribute : Attribute
{
public SerializableAttribute();
}
}
AttributeUsage比较重要,有三个重要的参数可以设置,
AttributeTargets 这是一个枚举,列出了自定义特性可以用来修饰谁,Class, interface 或者全都可以,多个中间用|隔开。如果你用一个只允许AttributeTargets.Class的特性修饰一个interface去,那注定编译失败。
[AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Interface | AttributeTargets.Delegate, Inherited = false)]
AllowMultiple 表示是否可以重复放置此特性来修饰一个方法或类。
[Lzd(Name = "Animal")]
[Lzd(Name = "Animals")]
public class Animal
{
...
}
Inherited 表示是否可以被继承
如果Inherited = false,则派生类继承不了特性。
如果Inherited = true, 派生类可以继承特性,但是,如果AllowMultiple = false, 那么,如果派生类自己也加了同样的特性,则父类的特性会被屏蔽。
参考了下面仁兄的文章:http://www.stuhack.com/biancheng/c_/8272.html
邮箱:lzd_ren@hotmail.com
出处:http://www.cnblogs.com/liuzhendong
本文版权归作者所有,欢迎转载,未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。