码迷,mamicode.com
首页 > 其他好文 > 详细

反射 学习笔记(三)特性基本概念

时间:2015-07-01 17:28:16      阅读:98      评论:0      收藏:0      [点我收藏+]

标签:

.net编译器的任务之一是为所有定义和引用的类型生成元数据描述。
除了程序集中标准的元数据外,.net平台允许程序员使用特性(attribute)把更多的元数据嵌入到程序集中。
特性就是用于类型(类、接口、结构等)、成员(属性、方法、字段、事件、构造函数等)、程序集或模块的代码注解。
使用特性修饰类型,结果是增加了底层程序集元数据。

特性使用者
1 开发工具
C#编译器(csc.exe)本身就要在编译周期中寻找各种特性是否存在。
例如:C#编译器遇到[CLSCompilant]特性,它将自动检查特性项,确保它只公开符合CLS(公共语言规范的结构)。
C#编译器发现一个带有[Obsolete]特性的项,它将在VS的错误列表窗口显示一个编译器警告。
2 .Net基础类库中许多方法被设定为要反射指定的特性。
例如:使用[Serializable]特性来注释类,将该类的对象状态持久化到文件中。如果Binary-Formatter类的Serialize()方法遇到这个特性,对象自动以紧凑的二进制形式被持久化到文件中。
3 .NET CLR也会巡查某些特性是否存在。
例如:[WebMethod]用于使用ASP.NET构建XML Web服务。如果希望通过HTTP请求公开一个方法并且自动将这个方法的返回值编码成XML,只需给方法应用[WebMethod]特性,由CLR来处理细节。

可以应用多个特性到一个单独项上,可以分开写,也可以使用逗号分隔列出。
例如:
[Serializable,Obsolete]等同于
[Serializable]
[Obsolete]
注意,这里特性都是简化符号(省去Attribute后缀),这是C#支持的,并不是所有.Net语言都支持。

理解:当给特性提供构造参数时,直到该参数被其他类型或外部工具反射后,特性才被分配到内存中。定义在特性级的字符串数据只是作为元数据介绍被存储在程序集中。

特性是派生自System.Attribute的类;
特性导致嵌入的元数据;
直到被其他代理反射,特性才发挥作用;
特性在C#中使用方括号来应用。

特定元素使用的特性
在自定义特性的定义中应用[AttributeUsage]特性,该特性支持AttributeTargets枚举值的任意组合(通过or操作|)
[AttributeUsage]特性允许我们设置命名属性
例如
AllowMultiple:相同项上特性是否可以被应用多次(默认false)
Inherited:是否能被派生类继承(默认true)

程序集级别和模块级别的特性
给定模块的所有类型[module:]
给定程序集的所有模块[assembly:]
注意事项:程序集或者模块级别特性必须在命名空间范围外进行定义

晚期绑定是动态加载的直接结果,允许通过编程方式在内存中加载.NET程序集。
一个特性直到另一个软件反射它的值时才有用。给定特性被发送后,软件可以采取任何需要的行为。

反射是运行时把一个类型放置在放大镜下,理解一个给定项是谁,做什么,在哪里,什么时候,为什么做和怎样做的过程。

反射 学习笔记(三)特性基本概念

标签:

原文地址:http://www.cnblogs.com/newstar87/p/4613375.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!