欢迎来到.net学习网

欢迎联系站长一起更新本网站!QQ:879621940

您当前所在位置:首页 »  .NET本质论第一卷:公共语言运行库教程 » 正文

本教程章节列表
最新评论

元数据和可扩展性

创建时间:2012年10月12日 10:08  阅读次数:(5443)
分享到:
本章再给你一个暗示,就是你可以相当自由地使用元数据特性,而不必提供正式的定义。CLR元数据中的大多数构件都有一个32位特性(Attribute)字段,用于调整该特性所关联的类型、字段和方法的定义。这些特性的解释和格式很很明确,它们已经在递交到ECMA[致州计算机制造商协会(European Computer Manufacturers Association)]的CLI[公共语言基础结构(Commnon Language infrastructure)]规范中定义了。到目前为止,计论的元数据特性有initonly(字段)、beforefieldinit(类型)和hidebysig,(方法)。为了使这些固化的特性可见,你既可以使用反射,也可以采用非托管的元数据接门IMetaDataImport。
    
对于这此与编程语言相关的设置,编译器将负责处理,本章已经描述了不同编笃器的一些策略,包括c#编译器( CSC.EXE)。

有时编程语言的设计者会选择公开一个元数据特性,将其作为修饰符关键字一例如,c#的readonly字段修饰符)。然而,为了避免关键字数量的膨胀,往往采用另一种机制,那就是自定义特性( custom Attribute)。

自定义特性允许语言设计者支持任意的元数据特性,而不用引入新的关键字到编程语言中。当自定义特性被用于支持CLI的预定义特性时,它们被称为伪定制特性( pseudo-custom Attribute),原因就是当编译器发射CLR元数据时,这个特性将被转换成一个标准的固定特性。例如,CLI在类型的元数据中预定义了一个标志,以标明类型的实例是否支持对象的序列化。尽管这个特性在元数据中只是一个简单的二进制位,但它被System.SerializableAttribute伪定制特性控制。

自定义特性更令人感兴趣的应用是:它允许任何人扩展CLR元数据格式。如果你觉得在现有的元数据格式中,一个字段或方法的某个方面无法获取,那么,你就可以定义自己的自定义特性来表示那个方面。自定义特性可以通过使用反射,或者本书后面讨论的其他机制检测到。

自定义特性本身是强类型的。一个自定义特件是System.Attribute类型的直接或者间接派生类型的一个实例。考虑下面的c#类声明:
Public sealed class TestedAttribute:System.Attribute
{
}
Public sealed class DocumentedAttribute:System.Attribute
{
}

因为这些类型是以System.Attributes作为它们的基类型,所以它们可以用于扩充字段、方法、类型或者其他元数据构件的定义。

每种编程语言都必须提供一个机制,用于将任意特性应用到类型、字段、方法或者其他CLR构件的声明上。应用自定义特性的语法会因语言的不同而有所差别。在C++或C#中,可以在定义之前使用一对方括号(例如,[TestAttribute])包含自定义特性。在VB.NET中则使用尖括号(例如,<TestedAttribute>)。不管使用哪种编程语言,特性名必须对应一个类型,其直接或间接的基类型是System.Attribute。

下面的c#类型定义对每个方法应用了一个或两个自定义特性
public sealed class Mycode
[TestedAttribute]
[DocumentedAttribute ]
static void t f() { }

[ Tested ]
static void h(){}

在这些方法中,每一个特性声明都在特性目标之前,还要注意的是,在c#中,如果特性名是以Attribute结尾,就可以省略Attrioute后缀。最后,请注意在应用多重特性时,它们可以分别出现在独立的[]中,或者在一个[]中以逗号分隔。

有时候,自定义特性的目标可能是模棱两可的。例如,当一个自定义特性在一个方法声明之前,也在返回值的类型名之前。在这种情况下,这个特性的目标是什么?为了解决这种二义性,每种编程语言都提供了种机制,使它变得明确。考虑下面的c#代码:
[ass
[asserrbly; Red ]
[module: Green ]
[class: Blue ]
[ Yellow ]
publie sealed class Widge
{
 [return: Cyan ]
 [method: Magentd ]
 [ Black ]
 public int Splat()
}

在这个示例中,Red特性应用到声明的程序集,Green特性应用到声明的模块,Blue特件和Yellow特性应用到Widgpt类型。Maganta特性和Black特性应用到Widget.Splat方法。Cyan特性应用到Widget.Spalt方法的返同值。

自定义特性被作为被动的BLOB(二进制大对象块,Binary Large Objects Block)存储在CLR元数据中,这些BLOB表现为对特性类型的(被序列化的)构造函数的调用。自定义特性的存在与否不影响CLR对类型的处理。相反地,自定义特性处丁一种休眠状态,等待程序使用反射和其他元数据接口去读取它们。

System.Reflection.ICustomAttributeProvider接口在反射对象模型中充当特性元索的模型。ICustomAttributeProvider接口被MemberInfo、ParameterInto、Asseembly和Module支持,它们包含了反射对象模型中的大部分元素。}T Tzz魰剉P枤[ T b€O(uN
来源:.net学习网
说明:所有来源为 .net学习网的文章均为原创,如有转载,请在转载处标注本页地址,谢谢!
【编辑:Wyf】

打赏

取消

感谢您的支持,我会做的更好!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

最新评论

共有评论0条
  • 暂无任何评论,请留下您对本文章的看法,共同参入讨论!
发表评论:
留言人:
内  容:
请输入问题 28+26=? 的结果(结果是:54)
结  果: