现在让我们来讨论Microsoft .Net最具创意的技术之一:定制attribute。相信很多人都用过,例如在使用很多.Net技术时(例如:Windows窗体、Web窗体、XML Web服务等等)。利用定制attribute,可以声明性地为自己的代码添加注解,从而实现一些特殊功能。定制attribute允许将定义的信息应用于几乎每一个元数据的记录项(如:类型TypeDef[类、结构、枚举、接口、委托],方法MethodDef[含构造器],参数ParamDef,字段FieldDef,属性PropertyDef,事件EventDef,AssemblyDef程序集,ModuleDef模块)。这种可扩展的元数据信息能在运行时查询,从而动态改变代码的执行方式。
说了这么多,让我们来了解下定制attribute到底是什么。定制attribute实际是一个类的实例。为了符合CLS的要求,定制attribute类必须直接或间接地从公共抽象类System.Attribute派生。我们来看一个例子:
[DllImport("Kernel132",CharSet=CharSet.Auto,SetLastError=true)]
实际上,将一个attribute应用于一个目标元素时,语法类似于调用类的某个实例构造器。就像这里DllImport就有一个接受String类型参数的构造器,我们传了"Kernel132"。定制attribute类的构造器的参数称为“定位参数”。此外,允许设置与定制attribute类关联的公共字段或属性。定制attribute类有种特殊语法,允许定制attribute对象构造好之后,设置对象的任何公共字段或属性,就像这里DllImport的公共实例字段CharSet和SetLastError被分别设置为CharSet.Auto和true。
关于定制attribute,应知道的是它们只是将一些附加信息与某个目标元素关联起来,编译器在托管模块的元数据中生成这些额外的元素。大多数定制attribute对编译器来说没有意义,编译器只是在源代码中检测定制attribute,并生成对应的元数据。在构造并初始化好定制attribute类对象之后,编译器会将这个attribute对象的状态序列化到目标元素的元数据表记录项中。所谓"定制attribute",就是一个类的实例,它被序列化成驻留在元数据中的一个字节流。在运行时,可以对元数据中包含的字节进行反序列化,从而构造类的一个实例。
目前需要理解的是仅仅定义一个attribute类是没用的,将它们应用在一些目标元素上,除了在程序集中生成额外的元数据之外,没有任何意义。应用程序代码的行为不会有任何改变。所以我们要知道的是,定义定制attribute时,也必须实现一些代码来检测某些目标上是否存在该attribute类的实例,然后执行一些逻辑分支代码。正因为能做到这一点,定制attribute才如此有用。也就是说,定制attribute只是将它的信息序列化到了目标元素的元数据中,真正要改变目标元素的行为,需要靠调用目标元素处的代码来获取这些信息然后做出不同的行为。
所以我们需要在调用目标元素处的代码那里检测定制attribute,然后执行一些逻辑分支代码。
System.Attribute定义了三个静态方法来获取与一个目标关联的attribute(IsDefine、GetCustomAttributes、GetCustomAttribute------->p388)System.Reflection里定义了几个类允许你检查一个模块的元数据,这几个类还提供了类似的IsDefine、GetCustomAtrributes方法------->p389
检测定制attribute时不创建从Attribute派生的对象(使用System.Reflection.CustomAttributeData类------->p393)
最后我们来了解一下条件attribute类,我们先来看看如下代码:
//#define TEST
#define VERIFY
using System;
[Conditional("TEST")][Conditional("VERIFY")]
public sealed class CondAttribute:Attribute{...}
[Cond]
puclic class SomeClass{...}
如果一个attribute类应用了System.Diagnostics.ConditionalAttribute,就称为条件attribute类
编译器如果发现向目标元素应用了CondAttribute的一个实例,那么当含有目标元素的代码编译时,只有在定义TEST或VERIFY符号的前提下,编译器才会在元数据中生成attribute信息。
http://kb.cnblogs.com/page/87531/
http://blog.csdn.net/niwalker/article/month/2003/07
相关推荐
· 高效使用特定的CLR类型——委托、枚举、定制attribute、数组和字符串 · 理解垃圾回收器是如何管理内存资源的 · 使用线程池、任务、取消、计时器和异步I/O操作来设计响应性强、稳定性高和伸缩性大的解决方案 · ...
· 高效使用特定的CLR类型——委托、枚举、定制attribute、数组和字符串 · 理解垃圾回收器是如何管理内存资源的 · 使用线程池、任务、取消、计时器和异步I/O操作来设计响应性强、稳定性高和伸缩性大的解决方案 ...
· 高效使用特定的CLR类型——委托、枚举、定制attribute、数组和字符串 · 理解垃圾回收器是如何管理内存资源的 · 使用线程池、任务、取消、计时器和异步I/O操作来设计响应性强、稳定性高和伸缩性大的解决方案 · ...
· 高效使用特定的CLR类型——委托、枚举、定制attribute、数组和字符串 · 理解垃圾回收器是如何管理内存资源的 · 使用线程池、任务、取消、计时器和异步I/O操作来设计响应性强、稳定性高和伸缩性大的解决方案 · ...
### Android XML Attribute详解 在Android开发中,XML文件扮演着非常重要的角色,特别是在定义界面布局、样式、动画等方面。为了帮助开发者更好地理解Android中的各种XML属性及其用途,本文将详细介绍部分核心XML...
对于那些希望定制化自己的GIS应用的开发者而言,了解如何在ArcGIS Server中添加自定义上下文属性是非常重要的。 #### 为什么需要自定义上下文属性 在实际应用中,用户往往需要根据特定的需求对地图或地理数据进行...
接下来,GRN是一个为随机游走定制的深度嵌入体系结构。它赋予节点表示以一种类似于其在原始属性网络中交互的方式,从而更好地捕捉节点之间的复杂关系。GRN利用递归神经网络(Recurrent Neural Network, RNN)的特性...
// 这里可以进一步执行根据属性信息定制的操作 } } ``` 这个例子展示了如何通过反射查找带有`CustomAttribute`的类,并读取其描述。 总结来说,C#的Attribute和Reflection提供了强大的元数据管理和运行时代码...
这个条件语句遵循SQL语法,可以根据实际需求进行定制。 然后,通过ArcGIS Server的MapService实例,调用其`ExecuteQuery`方法,传入我们定义好的查询过滤器。这个方法会返回一个`FeatureSet`对象,其中包含了满足...
开源软件的特性使得Free File Attribute Changer具有更高的透明度和可定制性。用户可以查看并修改源代码,了解其工作原理,甚至根据自己的需求进行二次开发。开源社区的支持也意味着持续的更新和改进,用户可以期待...
NX二次开发UF_ATTR_set_user_attribute 函数介绍,Ufun提供了一系列丰富的 API 函数,可以帮助用户实现自动化、定制化和扩展 NX 软件的功能。无论您是从事机械设计、制造、模具设计、逆向工程、CAE 分析等领域的专业...
NX二次开发UF_ATTR_has_user_attribute 函数介绍,Ufun提供了一系列丰富的 API 函数,可以帮助用户实现自动化、定制化和扩展 NX 软件的功能。无论您是从事机械设计、制造、模具设计、逆向工程、CAE 分析等领域的专业...
NX二次开发UF_ATTR_get_user_attribute 函数介绍,Ufun提供了一系列丰富的 API 函数,可以帮助用户实现自动化、定制化和扩展 NX 软件的功能。无论您是从事机械设计、制造、模具设计、逆向工程、CAE 分析等领域的专业...
NX二次开发UF_PD_ask_product_attribute_data 函数介绍,Ufun提供了一系列丰富的 API 函数,可以帮助用户实现自动化、定制化和扩展 NX 软件的功能。无论您是从事机械设计、制造、模具设计、逆向工程、CAE 分析等领域...
NX二次开发UF_ATTR_set_string_user_attribute 函数介绍,Ufun提供了一系列丰富的 API 函数,可以帮助用户实现自动化、定制化和扩展 NX 软件的功能。无论您是从事机械设计、制造、模具设计、逆向工程、CAE 分析等...
NX二次开发UF_ATTR_init_user_attribute_info 函数介绍,Ufun提供了一系列丰富的 API 函数,可以帮助用户实现自动化、定制化和扩展 NX 软件的功能。无论您是从事机械设计、制造、模具设计、逆向工程、CAE 分析等领域...
NX二次开发UF_ATTR_get_string_user_attribute 函数介绍,Ufun提供了一系列丰富的 API 函数,可以帮助用户实现自动化、定制化和扩展 NX 软件的功能。无论您是从事机械设计、制造、模具设计、逆向工程、CAE 分析等...
NX二次开发UF_ATTR_get_real_user_attribute 函数介绍,Ufun提供了一系列丰富的 API 函数,可以帮助用户实现自动化、定制化和扩展 NX 软件的功能。无论您是从事机械设计、制造、模具设计、逆向工程、CAE 分析等领域...
NX二次开发UF_ATTR_get_null_user_attribute 函数介绍,Ufun提供了一系列丰富的 API 函数,可以帮助用户实现自动化、定制化和扩展 NX 软件的功能。无论您是从事机械设计、制造、模具设计、逆向工程、CAE 分析等领域...
NX二次开发UF_ATTR_get_integer_user_attribute 函数介绍,Ufun提供了一系列丰富的 API 函数,可以帮助用户实现自动化、定制化和扩展 NX 软件的功能。无论您是从事机械设计、制造、模具设计、逆向工程、CAE 分析等...