首页 > 代码库 > 读书笔记(特性)

读书笔记(特性)

  特性是一种有别于普通命令式编程的编程方式,通常被称为申明式编程方式

  所谓申明式的编程方式,就是指程序员只需申明某个模块会具有怎样的特性,而无须关心如何去实现

  

1     [PermissionSetAttribute(SecurityAction.Demand,namespace="FullTrust")]2     class UseReflection 3     {4       //some code5     }

  当一个特性被添加到某个元素上时,该元素就被认为具有了这个特性所代表的功能或性质

  例如上述代码UseReflection 类型在添加了PermissionSetAttribute之后,就会被认为需要有完全信任的通行证才能运行

  

 1 /// <summary> 2         /// 使用自定义特性 3         /// </summary> 4         [MyAttribute("UseMyAttribute")] 5         class UseMyAttribute  6         { 7             public static void TestMyAttribute()  8             { 9                 Type t  = typeof(UseMyAttribute);10                 //得到自定义特性11                 Object[] attribute = t.GetCustomAttributes(false);12                 MyAttribute att = (MyAttribute)attribute[0];13                 Console.WriteLine(att.ClassName);14             }15         }16 17 18         /// <summary>19         /// 自定义的特性20         /// </summary>21         [AttributeUsage(AttributeTargets.Class)]22         public class MyAttribute : Attribute 23         {24             private String _classname;25             public MyAttribute(string s) 26             {27                 _classname = s;28             }29             public string ClassName 30             {31                 get 32                 {33                     return _classname;34                 }35             }36         } 

  特性可以应用在程序集,模块,类,结构,枚举,构造方法,方法,属性,字段,事件,接口,参数,委托,返回参数和泛型参数这些目标元素之上,通过AttributeUsage特性可以限制自定义特性的使用范围

.net提供的查找是否申明指定特性的方法

  1. System.Attribute.IsDefined

  这是一个高效判断某个元素是否申明了某特性的方法,它的高效在于该方法不会实际地初始化特性

  而只是查找该元数据并且返回一个布尔型变量来指明是否查找到指定的属性

  2. System.Attribute.GetCustomerAttribute

  该方法用于得到申明在指定元素上的一个指定特性的实例对象,如果指定元素没有包含指定的特性或其派生特性,则会返回NULL

  同时如果指定元素申明了多次制定的特性或者其派生特性,则会抛出一个System.Reflection.AmbiguousMatchException的异常

  3. System.Attribute.GetCustomerAttributes

  该方法类似于System.Attribute.GetCustomerAttribute方法 不同的是该方法将以一数组的形式返回查找到底符合条件的所有特性对象

  4. System.Reflection.CustomAttributeData

  该类型拥有一个已重载的静态方法GetCustomAttribte用已获得一个IList<AttributeData>的对象,而每一个CustomAttributeData对象都封装了特性的详细  信息

当一个特性申明了AttributeUsage特性并且显式地将AllowMultiple属性设置为true时,该特性就可以在同一元素上多次申明,否则地话编译器将报错