第12章特性
特性的基本概念
特性的使用
预定义通用特性类
自定义特性类
使用反射访问特性
C#,称之为特性(Attribute)类
一个关于特性类的声明定义一种新特性,特性可以被放置在其他声明上,即附加到各种程序实体(包括类型、方法、属性等),以添加元数据信息,如编译器指令或数据描述
特性主要为编译器提供额外的信息,编译器可以通过这些附加特性,自动生成相应的代码,从而实现特定的功能。程序代码也可以通过反射技术,在运行时环境中检索这些特性信息,以实现特定的操作
C#语言包括下列2种形式的特性:
公共语言运行库(CLR)中预定义的特性
自定义特性,用于向代码中添加附加信息,该信息能够以编程方式检索
特性类可以具有定位参数(positional parameter)和命名参数(named parameter)列表
将特性附加到程序实体的语法为:将括在方括号中的特性名置于其适用的实体声明之前。例如,C#外部方法的声明需要通过DllImport 特性以引用由DLL(动态链接库)实现的外部函数
根据约定,所有特性类都以单词“Attribute”结束,以区分于其它类。但是,在代码中,可以省略特性后缀“Attribute”
预定义通用特性类
ConditionalAttribute类:条件方法
ObsoleteAttribute类:标记为一个建议不再使用的实体
AttributeUsageAttribute类
全局特性
ConditionalAttribute类
Conditional特性是ConditionalAttribute的别名,可应用于类或结构声明中的返回类型为void的方法。
用Conditional特性修饰的方法是条件方法
Conditional特性通过测试条件编译符号来确定适用的条件。标记为条件方法的调用取决于是否定义了预处理符号:如果定义了该符号,则包含调用;否则省略调用
ObsoleteAttribute类
Obsolete特性是ObsoleteAttribute的别名,可应用于除程序集、模块、参数或返回值以外的所有程序元素,将该实体标记为一个建议不再使用的实体,即该元素在产品的未来版本中将被移除
当调用使用Obsolete特性标记的实体时,编译器会生成警告信息;如果Obsolete特性的第2个参数为true时,则产生错误信息。
AttributeUsageAttribute类
AttributeUsage特性是AttributeUsageAttribute 的别名,应用于自定义特性类,以控制如何应用新特性
用 AttributeUsage特性修饰的类必须直接或间接从 派生,否则将发生编译时错误
AttributeUsage特性可以设置3个参数:
ValidOn参数
AllowMultiple参数
Inherited参数
全局特性
全局特性适用于整个程序集或模块。全局特性在源代码中出现在顶级using指令之后,类型或命名空间声明之前
自定义特性类
,可以创建自定义特性类。特性类直接或间接地从 Attribute 派生,有助于方便快捷地在元数据中标识特性定义。
特性类的声明遵循下列规则:
派生类的类名一般采用XXXAttribute的命名规范,类名就是特性名。
构造函数的参数是自定义特性的定位参数。
任何公共读写字段或属性都是命名参数。
使用AttributeUsage特性指定特性类的限制条件
使用反射访问特性
C#通过反射技术来检索用自定义特性定义的信息。首先通过GetType方法或者typeof关键字来获取类型;然后通过GetCustomAttributes方法获取所应用的自定义特性的对象数组;最后通过自定义特性的对象数组进行相应的操作处理
C#课件:特性 来自淘豆网m.daumloan.com转载请标明出处.