第十八章 定制特性

Posted terry-1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第十八章 定制特性相关的知识,希望对你有一定的参考价值。

目录:

18.1 使用定制特性

18.2 定义自己的特性类

18.3 特性构造器和字段/属性数据类型

18.4 检测定制特性

18.5 两个特性实例的相互匹配

18.6 检测定制特性时不创建从Attribute派生的对象

18.7 条件特性类

 

定制特性:利用定制特性,可宣告式地为自己的代码构造添加注解来实现特殊功能。定制特性允许为几乎每一个元数据表记录项定义和应用信息。这种可扩展的元数据信息能在运行时查询,从而动态改变代码的执行方法。

18.1 使用定制特性

自定义特性将一些附加信息与某个目标元素关联起来。编译器在托管模块的元数据中生成(嵌入)这些额外的信息。

定制特性其实是一个类型的实例。为了符合CLS的要求,定制特性类必须直接或间接从公共抽象类System.Attribut派生。

特性时类的实例,类必须有公共构造器才能创建它的实例。所以,将特性应用于目标元素时,语法类型于调用类的某个实例构造器。除此之外,语言可能支持一些特殊的语法,允许设置与特性类关联的公共字段或属性。

构造器参数称为定位参数,而且时强制性的;也就是说,应用特性时必须指定参数。用于设置字段或属性的“参数”称为“命名参数

18.2 定义自己的特性类

AttributeUsage特性:

公共构造器:它允许传递位标志来指明特性的合法应用范围。

AllowMultiple属性:设置为true,特性就只能向选定的目标元素应用一次。(可选)

Inherited属性:它指出特性在应用于基类时,是否同时应用于派生类和重写的方法。true为应用(可选)注意:.NET Framework只认为类,方法,属性,事件,字段,方法返回值和参数等目标元素时可继承的。所以,定义特性类型时,只有在该特性应用于上述某个目标的前提下,才可以将Inherited设为true。

18.3 特性构造器和字段/属性数据类型

应用特性时必须传递一个编译时常量表达式,它与特性类定义的类型匹配。

编译器采用增强型构造器语法所指定的值,对任何公共字段和属性进行初始化。构造并初始化好定制特性类的对象之后,编译器将它的状态序列化到目标元素的元素据表记录项中。 

18.4 检测定制特性

 可利用反射的技术检测特性是否存在。

IsDefined:如果至少有一个指定的Attribute派生类的实例与目标关联,就返回true。这个方法效率很高,因为它不够造(反序列化)特性类的任何实例。

GetCustomAttributes:返回应用于目标的指定特性对象的集合。每个实例都使用编译时指定的参数,字段和属性来构造(反序列化)。如果目标没有应用指定等特性类的实例,就返回一个空集合。该方法通常用于已将AllowMultiple设为true的特性,或者用于列出已应用的所有特性。

GetCustomAttribute;返回应用于目标的指定特性类的实例。实例使用编译时指定的参数,字段和属性来构造(反序列化)。如果目标没有应用特性类的实例,就返回null。若果目标应用了指定特性的多个实例,就抛出异常。该方法通常用于已将AllowMultiple设为false的特性。

调用上述人的方法,内部都必须扫描托管模块的元数据,执行字符串比较来定位指定的定制特性类。

18.5 两个特性实例的相互匹配

 

18.6 检测定制特性时不创建从Attribute派生的对象

 

18.7 条件特性类

 

以上是关于第十八章 定制特性的主要内容,如果未能解决你的问题,请参考以下文章

Linux内核分析——第十八章 调试

第十八章 springboot + thymeleaf

第十八章 JDBC

第十八章:构造方式

第十八章:构造方式

“全栈2019”Java异常第十八章:Exception详解