- 1、本文档共46页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第十二章 反射 本课内容 了解反射的基本概念 了解特性的基本概念 通过反射读取类、模块、程序集 通过反射读取作用于类、模块、程序集上的特性 使用反射动态创建类,并使用类中的方法 反射的概念 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。 这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。 早期的LEAD/LEAD++?、OpenC++?、MetaXa和OpenJava等就是基于反射机制的语言。 反射的概念 运用强大的反射技术,可以在程序的运行过程中读取和处理程序集。它的具体功能如下: (1)在程序运行中枚举程序集中类型的成员 (2)在程序运行中查找数据类型的各种信息 (3)在程序运行中查找程序集的各种信息 (4)在程序运行中查找应用于类型、模块和程序集的定制特性 (5)在程序运行中实例化新对象 (6)在程序运行中执行对象的方法等 (7)在程序运行中创建和编译新程序集 关于特性 特性的概念 特性的概念 DllImport STAThread与MTAThread 插入的知识 Obsolete 其它特性 预定义特性的总结 开发自定义的特性 开发自定义的特性 定义/控制自定义特性的使用 开发自定义的特性 AttributeTargets AllowMultiple Inherited Inherited 定位参数与命名参数 属性标识 特性示例 反射 System.Type类 Type的属性 Type的属性 Type的属性 Type的方法 Type的方法 Type的方法 TypeView示例 Assembly类 查找在程序集中定义的类型 查找定制特性 LookUpWhatsNew示例 查找定制特性 一个遗留问题 动态创建对象及调用 1.使用无参数构造函数创建对象 2.使用有参数构造函数创建对象 3、动态调用方法 总结 本课介绍了系统预定义特性(Attribute)。 还介绍了特性作为说明性的内容,可以和程序绑定在一起,通过反射来调用它。 另外我们还知道反射捕获的内容是程序集级别的,在程序集下可以捕捉所有的类,并可以查找作用在这些类上的定制特性,了解这些类的说明文档,为下一步的处理做好准备。 反射的技术应用是比较流行的话题,也是一个技术趋势。 实践 实践:利用定制特性将以前做的+、-、×、\运算器做一个版本说明,然后利用反射去读取它们。 GetProperty(), GetProperties() PropertyInfo GetMethod(), GetMethods() MethodInfo GetMember(), GetMembers() MemberInfo GetInterface(), GetInterfaces() InterfaceInfo GetField(), GetFields() FieldInfo GetEvent(), GetEvents() EventInfo GetConstructor(), GetConstructors() ConstructorInfo 方法 (名称为复数形式的方法返回一个数组) 返回的对象类型 (1)GetMember() 和 GetMembers()方法返回数据类型的一个或所有成员的信息,这些成员可以是构造函数、属性和方法等。 (2)如果操作和调用这些成员,其方式是调用Type的InvokeMember()方法,或者调用MethodInfo, PropertyInfo和其他类的Invoke()方法。 关于调用请参阅后面的部分。 见《例子源代码》下的WindowsApplicationTypeView (1)Assembly类在System.Reflection命名空间中定义,它允许用户访问给定程序集的元数据,它也包含可以加载和执行程序集(假定该程序集是可执行的) 的方法。 (2)与Type类一样,Assembly类包含非常多的方法和属性,这里不可能一一论述。 (3)使用静态成员Assembly.Load() 或 Assembly.LoadFrom()获取程序集实例。 Assembly assembly1 = Assembly.Load(SomeAssembly); Assembly assembly2 = Assembly.LoadFrom (@C:\My Projects\Software\SomeOtherAssembly); Assembly类的一个特性是可以获得在相应程序集中定义的所有类型的信息,调用Assembly.GetTypes()方法,就可以返回一个包含所有
文档评论(0)