欢迎来到天天文库
浏览记录
ID:39466552
大小:526.00 KB
页数:10页
时间:2019-07-04
《NET反射的分析与使用》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、.NET反射的定义:审查元数据并收集关于它的类型信息的能力。元数据是一种二进制信息,用以对存储在公共语言运行库可移植可执行文件(PE)文件或存储在内存中的程序进行描述。将您的代码编译为PE文件时,便会将元数据插入到该文件的一部分中。而将代码转换为Microsoft中间语言(MSIL)并将其插入到该文件的另一部分中。在模块或程序集中定义和引用的每个类型和成员都将在元数据中进行说明。当执行代码时,运行库将元数据加载到内存中,并引用它来发现有关代码的类、成员、继承等信息。元数据以非特定语言的方式描述在代码中定义的每一类型和成员
2、。元数据存储以下信息:程序集的说明:1.标识(名称、版本、区域性、公钥)。2.导出的类型。3.该程序集所依赖的其他程序集。4.运行所需的安全权限。类型的说明:1.名称、可见性、基类和实现的接口。2.成员(方法、字段、属性、事件、嵌套的类型)。属性:1.修饰类型和成员的其他说明性元素。System.reflection命名空间包含的几个类,允许你反射(解析)这些元数据表的代码和反射相关的命名空间(我们就是通过这几个命名空间访问反射信息):System.Reflection.MemberInfoSystem.Reflecti
3、on.EventInfoSystem.Reflection.FieldInfoSystem.Reflection.MethodBaseSystem.Reflection.ConstructorInfoSystem.Reflection.MethodInfoSystem.Reflection.PropertyInfoSystem.TypeSystem.Reflection.Assembly.NET反射的作用:1.可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。2.应用程序需要在运行时从某个特
4、定的程序集中载入一个特定的类型,以便实现某个任务时可以用到反射。3.反射主要应用与类库,这些类库需要知道一个类型的定义,以便提供更多的功能。应用要点:1.在.net实现工厂模式的时候好多都会用到反射。而工厂模式用的很多。2.使用反射动态绑定需要牺牲性能。3.有些元数据信息是不能通过反射获取的。4.某些反射类型是专门为那些clr开发编译器的开发使用的,所以你要意识到不是所有的反射类型都是适合每个人的。反射单个程序集1.Load方法:极力推荐的一种方法,Load方法带有一个程序集标志并载入它,Load将引起CLR把策略应用到
5、程序集上。先后在全局程序集缓冲区,应用程序基目录和私有路径下面查找该程序集,如果找不到该程序集系统抛出异常。2.LoadFrom方法:传递一个程序集文件的路径名(包括扩展名),CLR会载入您指定的这个程序集,传递的这个参数不能包含任何关于版本号的信息,区域性,和公钥信息,如果在指定路径找不到程序集抛出异常。3.LoadWithPartialName:永远不要使用这个方法,因为应用程序不能确定再在载入的程序集的版本。该方法的唯一用途是帮助那些在.Net框架的测试环节使用.net框架提供的某种行为的客户,这个方法将最终被抛弃
6、不用。反射的层次模型.NET反射的概述:应用程序结构分为应用程序域—程序集—模块—类型—成员几个层次,公共语言运行库加载器管理应用程序域。这些域在拥有相同应用程序范围的对象周围形成了确定边界。这种管理包括将每个程序集加载到相应的应用程序域以及控制每个程序集中类型层次结构的内存布局。程序集包含模块,而模块包含类型,类型又包含成员,反射则提供了封装程序集、模块和类型的对象。我们可以使用反射动态地创建类型的实例,将类型绑定到现有对象或从现有对象中获取类型,然后调用类型的方法或访问其字段和属性。反射通常具有以下用途:(1)使用A
7、ssembly定义和加载程序集,加载在程序集清单中列出模块,以及从此程序集中查找类型并创建该类型的实例。(2)使用Module了解包含模块的程序集以及模块中的类等,还可以获取在模块上定义的所有全局方法或其他特定的非全局方法。(3)使用ConstructorInfo了解构造函数的名称、参数、访问修饰符(如pulic或private)和实现详细信息(如abstract或virtual)等。使用Type的GetConstructors或GetConstructor方法来调用特定的构造函数。(4)使用MethodInfo了解方法
8、的名称、返回类型、参数、访问修饰符(如pulic或private)和实现详细信息(如abstract或virtual)等。使用Type的GetMethods或GetMethod方法来调用特定的方法。(5)使用FiedInfo了解字段的名称、访问修饰符(如public或private)和实现详细信息(如static)等
此文档下载收益归作者所有