`

定制 attribute

    博客分类:
  • CLR
 
阅读更多

       现在让我们来讨论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

http://blog.csdn.net/FantasiaX/article/details/1627694

http://blog.csdn.net/FantasiaX/article/details/1636913

分享到:
评论

相关推荐

    CLR.via.C#.(中文第3版)(自制详细书签)Part1

    · 高效使用特定的CLR类型——委托、枚举、定制attribute、数组和字符串 · 理解垃圾回收器是如何管理内存资源的 · 使用线程池、任务、取消、计时器和异步I/O操作来设计响应性强、稳定性高和伸缩性大的解决方案 · ...

    CLR.via.C#.(中文第3版)(自制详细书签)

    · 高效使用特定的CLR类型——委托、枚举、定制attribute、数组和字符串 · 理解垃圾回收器是如何管理内存资源的 · 使用线程池、任务、取消、计时器和异步I/O操作来设计响应性强、稳定性高和伸缩性大的解决方案 ...

    CLR.via.C#.(中文第3版)(自制详细书签)Part3

    · 高效使用特定的CLR类型——委托、枚举、定制attribute、数组和字符串 · 理解垃圾回收器是如何管理内存资源的 · 使用线程池、任务、取消、计时器和异步I/O操作来设计响应性强、稳定性高和伸缩性大的解决方案 · ...

    CLR.via.C#.(中文第3版)(自制详细书签)Part2

    · 高效使用特定的CLR类型——委托、枚举、定制attribute、数组和字符串 · 理解垃圾回收器是如何管理内存资源的 · 使用线程池、任务、取消、计时器和异步I/O操作来设计响应性强、稳定性高和伸缩性大的解决方案 · ...

    Android XML attribute

    ### Android XML Attribute详解 在Android开发中,XML文件扮演着非常重要的角色,特别是在定义界面布局、样式、动画等方面。为了帮助开发者更好地理解Android中的各种XML属性及其用途,本文将详细介绍部分核心XML...

    ArcGIS Server 9.2帮助文档翻译(6)Adding a Custom Context Attribute

    对于那些希望定制化自己的GIS应用的开发者而言,了解如何在ArcGIS Server中添加自定义上下文属性是非常重要的。 #### 为什么需要自定义上下文属性 在实际应用中,用户往往需要根据特定的需求对地图或地理数据进行...

    2019-KDD-Graph Recurrent Networks with Attributed Random Walks-网

    接下来,GRN是一个为随机游走定制的深度嵌入体系结构。它赋予节点表示以一种类似于其在原始属性网络中交互的方式,从而更好地捕捉节点之间的复杂关系。GRN利用递归神经网络(Recurrent Neural Network, RNN)的特性...

    C#基础--Attribute(标签) 和 reflect(反射) 应用

    // 这里可以进一步执行根据属性信息定制的操作 } } ``` 这个例子展示了如何通过反射查找带有`CustomAttribute`的类,并读取其描述。 总结来说,C#的Attribute和Reflection提供了强大的元数据管理和运行时代码...

    AttributeQuery.rar_AttributeQuery_c# arcgis

    这个条件语句遵循SQL语法,可以根据实际需求进行定制。 然后,通过ArcGIS Server的MapService实例,调用其`ExecuteQuery`方法,传入我们定义好的查询过滤器。这个方法会返回一个`FeatureSet`对象,其中包含了满足...

    Free File Attribute Changer:更改文件或文件的修改日期,创建日期和访问日期。-开源

    开源软件的特性使得Free File Attribute Changer具有更高的透明度和可定制性。用户可以查看并修改源代码,了解其工作原理,甚至根据自己的需求进行二次开发。开源社区的支持也意味着持续的更新和改进,用户可以期待...

    NX二次开发UF-ATTR-set-user-attribute 函数介绍

    NX二次开发UF_ATTR_set_user_attribute 函数介绍,Ufun提供了一系列丰富的 API 函数,可以帮助用户实现自动化、定制化和扩展 NX 软件的功能。无论您是从事机械设计、制造、模具设计、逆向工程、CAE 分析等领域的专业...

    NX二次开发UF-ATTR-has-user-attribute 函数介绍

    NX二次开发UF_ATTR_has_user_attribute 函数介绍,Ufun提供了一系列丰富的 API 函数,可以帮助用户实现自动化、定制化和扩展 NX 软件的功能。无论您是从事机械设计、制造、模具设计、逆向工程、CAE 分析等领域的专业...

    NX二次开发UF-ATTR-get-user-attribute 函数介绍

    NX二次开发UF_ATTR_get_user_attribute 函数介绍,Ufun提供了一系列丰富的 API 函数,可以帮助用户实现自动化、定制化和扩展 NX 软件的功能。无论您是从事机械设计、制造、模具设计、逆向工程、CAE 分析等领域的专业...

    NX二次开发UF-PD-ask-product-attribute-data 函数介绍

    NX二次开发UF_PD_ask_product_attribute_data 函数介绍,Ufun提供了一系列丰富的 API 函数,可以帮助用户实现自动化、定制化和扩展 NX 软件的功能。无论您是从事机械设计、制造、模具设计、逆向工程、CAE 分析等领域...

    NX二次开发UF-ATTR-set-string-user-attribute 函数介绍

    NX二次开发UF_ATTR_set_string_user_attribute 函数介绍,Ufun提供了一系列丰富的 API 函数,可以帮助用户实现自动化、定制化和扩展 NX 软件的功能。无论您是从事机械设计、制造、模具设计、逆向工程、CAE 分析等...

    NX二次开发UF-ATTR-init-user-attribute-info 函数介绍

    NX二次开发UF_ATTR_init_user_attribute_info 函数介绍,Ufun提供了一系列丰富的 API 函数,可以帮助用户实现自动化、定制化和扩展 NX 软件的功能。无论您是从事机械设计、制造、模具设计、逆向工程、CAE 分析等领域...

    NX二次开发UF-ATTR-get-string-user-attribute 函数介绍

    NX二次开发UF_ATTR_get_string_user_attribute 函数介绍,Ufun提供了一系列丰富的 API 函数,可以帮助用户实现自动化、定制化和扩展 NX 软件的功能。无论您是从事机械设计、制造、模具设计、逆向工程、CAE 分析等...

    NX二次开发UF-ATTR-get-real-user-attribute 函数介绍

    NX二次开发UF_ATTR_get_real_user_attribute 函数介绍,Ufun提供了一系列丰富的 API 函数,可以帮助用户实现自动化、定制化和扩展 NX 软件的功能。无论您是从事机械设计、制造、模具设计、逆向工程、CAE 分析等领域...

    NX二次开发UF-ATTR-get-null-user-attribute 函数介绍

    NX二次开发UF_ATTR_get_null_user_attribute 函数介绍,Ufun提供了一系列丰富的 API 函数,可以帮助用户实现自动化、定制化和扩展 NX 软件的功能。无论您是从事机械设计、制造、模具设计、逆向工程、CAE 分析等领域...

    NX二次开发UF-ATTR-get-integer-user-attribute 函数介绍

    NX二次开发UF_ATTR_get_integer_user_attribute 函数介绍,Ufun提供了一系列丰富的 API 函数,可以帮助用户实现自动化、定制化和扩展 NX 软件的功能。无论您是从事机械设计、制造、模具设计、逆向工程、CAE 分析等...

Global site tag (gtag.js) - Google Analytics