C#高级编程.第13章反射.doc

C#高级编程.第13章反射.doc

ID:56016539

大小:78.50 KB

页数:23页

时间:2020-03-15

C#高级编程.第13章反射.doc_第1页
C#高级编程.第13章反射.doc_第2页
C#高级编程.第13章反射.doc_第3页
C#高级编程.第13章反射.doc_第4页
C#高级编程.第13章反射.doc_第5页
资源描述:

《C#高级编程.第13章反射.doc》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、第13章反射反射是一个普通术语,描述了在运行过程中检查和处理程序元素的功能。例如,反射允许完成以下任务:●枚举类型的成员●实例化新对象●执行对象的成员●查找类型的信息●查找程序集的信息●检查应用于类型的定制特性●创建和编译新程序集这个列表列出了许多功能,包括.NETFramework类库提供的一些最强大、最复杂的功能。但本章不可能介绍反射的所有功能,仅讨论最常用的功能。首先讨论定制特性,定制特性允许把定制的元数据与程序元素关联起来。这些元数据是在编译过程中创建的,并嵌入到程序集中。接着就可以在运行期间使用反射的一些功能检查这些元数据了。在介绍了定制特性

2、后,本章将探讨支持反射的一些基类,包括System.Type和System.Reflection.Assembly类,它们可以访问反射提供的许多功能。为了演示定制特性和反射,我们将开发一个示例,说明公司如何定期升级软件,自动解释升级的信息。在这个示例中,要定义几个定制特性,表示程序元素最后修改或创建的日期,以及发生了什么变化。然后使用反射开发一个应用程序,在程序集中查找这些特性,自动显示软件自某个给定日期以来升级的所有信息。本章要讨论的另一个示例是一个应用程序,该程序读写数据库,并使用定制特性,把类和特性标记为对应的数据库表和列。然后在运行期间从程序集

3、中读取这些特性,使程序可以自动从数据库的相应位置检索或写入数据,无需为每个表或列编写特定的逻辑。第Ⅰ部分C#语言13.1定制特性前面介绍了如何在程序的各个数据项上定义特性。这些特性都是Microsoft定义好的,作为.NETFramework类库的一部分,许多特性都得到了C#编译器的支持。对于这些特性,编译器可以以特殊的方式定制编译过程,例如,可以根据StructLayout特性中的信息在内存中布置结构。.NETFramework也允许用户定义自己的特性。显然,这些特性不会影响编译过程,因为编译器不能识别它们,但这些特性在应用于程序元素时,可以在编译好

4、的程序集中用作元数据。这些元数据在文档说明中非常有用。但是,使定制特性非常强大的因素是使用反射,代码可以读取这些元数据,使用它们在运行期间作出决策,也就是说,定制特性可以直接影响代码运行的方式。例如,定制特性可以用于支持对定制许可类进行声明代码访问安全检查,把信息与程序元素关联起来,由测试工具使用,或者在开发可扩展的架构时,允许加载插件或模块。13.1.1编写定制特性为了理解编写定制特性的方式,应了解一下在编译器遇到代码中某个应用了定制特性的元素时,该如何处理。以数据库为例,假定有一个C#属性声明,如下所示。[FieldName("SocialSecu

5、rityNumber")]publicstringSocialSecurityNumber{get{//etc.当C#编译器发现这个属性有一个特性FieldName时,首先会把字符串Attribute添加到这个名称的后面,形成一个组合名称FieldNameAttribute,然后在其搜索路径的所有命名空间(即在using语句中提及的命名空间)中搜索有指定名称的类。但要注意,如果用一个特性标记数据项,而该特性的名称以字符串Attribute结尾,编译器就不会把该字符串加到组合名称中,而是不修改该特性名。因此,上面的代码实际上等价于:[FieldNameA

6、ttribute("SocialSecurityNumber")]publicstringSocialSecurityNumber{get{//etc.编译器会找到含有该名称的类,且这个类直接或间接派生自System.Attribute。编译器还认为这个类包含控制特性用法的信息。特别是属性类需要指定:●特性可以应用到哪些程序元素上(类、结构、属性和方法等)●它是否可以多次应用到同一个程序元素上●特性在应用到类或接口上时,是否由派生类和接口继承322第12章反射●这个特性有哪些必选和可选参数如果编译器找不到对应的特性类,或者找到一个这样的特性类,但使用特

7、性的方式与特性类中的信息不匹配,编译器就会产生一个编译错误。例如,如果特性类指定该特性只能应用于字段,但我们把它应用到结构定义上,就会产生一个编译错误。继续上面的示例,假定定义了一个FieldName特性:[AttributeUsage(AttributeTargets.Property,AllowMultiple=false,Inherited=false)]publicclassFieldNameAttribute:Attribute{privatestringname;publicFieldNameAttribute(stringname){th

8、is.name=name;}}下面几节讨论这个定义中的每个元素。1.AttributeUsag

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。