标签:范围 关联 序列 传递 允许 特殊功能 附加 调用 多个
目录:
18.1 使用定制特性
18.2 定义自己的特性类
18.3 特性构造器和字段/属性数据类型
18.4 检测定制特性
18.5 两个特性实例的相互匹配
18.6 检测定制特性时不创建从Attribute派生的对象
18.7 条件特性类
定制特性:利用定制特性,可宣告式地为自己的代码构造添加注解来实现特殊功能。定制特性允许为几乎每一个元数据表记录项定义和应用信息。这种可扩展的元数据信息能在运行时查询,从而动态改变代码的执行方法。
自定义特性将一些附加信息与某个目标元素关联起来。编译器在托管模块的元数据中生成(嵌入)这些额外的信息。
定制特性其实是一个类型的实例。为了符合CLS的要求,定制特性类必须直接或间接从公共抽象类System.Attribut派生。
特性时类的实例,类必须有公共构造器才能创建它的实例。所以,将特性应用于目标元素时,语法类型于调用类的某个实例构造器。除此之外,语言可能支持一些特殊的语法,允许设置与特性类关联的公共字段或属性。
构造器参数称为定位参数,而且时强制性的;也就是说,应用特性时必须指定参数。用于设置字段或属性的“参数”称为“命名参数”
AttributeUsage特性:
公共构造器:它允许传递位标志来指明特性的合法应用范围。
AllowMultiple属性:设置为true,特性就只能向选定的目标元素应用一次。(可选)
Inherited属性:它指出特性在应用于基类时,是否同时应用于派生类和重写的方法。true为应用(可选)注意:.NET Framework只认为类,方法,属性,事件,字段,方法返回值和参数等目标元素时可继承的。所以,定义特性类型时,只有在该特性应用于上述某个目标的前提下,才可以将Inherited设为true。
应用特性时必须传递一个编译时常量表达式,它与特性类定义的类型匹配。
编译器采用增强型构造器语法所指定的值,对任何公共字段和属性进行初始化。构造并初始化好定制特性类的对象之后,编译器将它的状态序列化到目标元素的元素据表记录项中。
可利用反射的技术检测特性是否存在。
IsDefined:如果至少有一个指定的Attribute派生类的实例与目标关联,就返回true。这个方法效率很高,因为它不够造(反序列化)特性类的任何实例。
GetCustomAttributes:返回应用于目标的指定特性对象的集合。每个实例都使用编译时指定的参数,字段和属性来构造(反序列化)。如果目标没有应用指定等特性类的实例,就返回一个空集合。该方法通常用于已将AllowMultiple设为true的特性,或者用于列出已应用的所有特性。
GetCustomAttribute;返回应用于目标的指定特性类的实例。实例使用编译时指定的参数,字段和属性来构造(反序列化)。如果目标没有应用特性类的实例,就返回null。若果目标应用了指定特性的多个实例,就抛出异常。该方法通常用于已将AllowMultiple设为false的特性。
调用上述人的方法,内部都必须扫描托管模块的元数据,执行字符串比较来定位指定的定制特性类。
标签:范围 关联 序列 传递 允许 特殊功能 附加 调用 多个
原文地址:https://www.cnblogs.com/terry-1/p/10389941.html