




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 www.bj-C#反射技术概念作用和要点反射(Reflection)是.NET中的重要机制,通过放射,可以在运行时获得.NET中每一个类型(包括类、结构、委托、接口和枚举等)的成员,包括方法、属性、事件,以及构造函数等。还可以获得每个成员的名称、限定符和参数等。有了反射,即可对每一个类型了如指掌。如果获得了构造函数的信息,即可直接创建对象,即使这个对象的类型在编译时还不知道。1、.NET可执行应用程序结构程序代码在编译后生成可执行的应用,我们首先要了解这种可执行应用程序的结构。应用程序结构分为应用程序域程序集模块类型成员几个层次,公共语言运行库加载器管理应用程序域,这种管理包括将每个程序集加
2、载到相应的应用程序域以及控制每个程序集中类型层次结构的内存布局。程序集包含模块,而模块包含类型,类型又包含成员,反射则提供了封装程序集、模块和类型的对象。我们可以使用反射动态地创建类型的实例,将类型绑定到现有对象或从现有对象中获取类型,然后调用类型的方法或访问其字段和属性。反射通常具有以下用途。(1)使用Assembly定义和加载程序集,加载在程序集清单中列出模块,以及从此程序集中查找类型并创建该类型的实例。(2)使用Module了解包含模块的程序集以及模块中的类等,还可以获取在模块上定义的所有全局方法或其他特定的非全局方法。(3)使用ConstructorInfo了解构造函数的名称、参数、访
3、问修饰符(如pulic 或private)和实现详细信息(如abstract或virtual)等。使用Type的GetConstructors或GetConstructor方法来调用特定的构造函数。(4)使用MethodInfo了解方法的名称、返回类型、参数、访问修饰符(如pulic 或private)和实现详细信息(如abstract或virtual)等。使用Type的GetMethods或GetMethod方法来调用特定的方法。(5)使用FiedInfo了解字段的名称、访问修饰符(如public或private)和实现详细信息(如static)等,并获取或设置字段值。(6)使用EventI
4、nfo了解事件的名称、事件处理程序数据类型、自定义属性、声明类型和反射类型等,添加或移除事件处理程序。(7)使用PropertyInfo了解属性的名称、数据类型、声明类型、反射类型和只读或可写状态等,获取或设置属性值。(8)使用ParameterInfo了解参数的名称、数据类型、是输入参数还是输出参数,以及参数在方法签名中的位置等。System.Reflection.Emit命名空间的类提供了一种特殊形式的反射,可以在运行时构造类型。反射也可用于创建称为类型浏览器的应用程序,使用户能够选择类型,然后查看有关选定类型的信息。此外,Jscript等语言编译器使用反射来构造符号表。System.Ru
5、ntime.Serialization命名空间中的类使用反射来访问数据并确定要永久保存的字段,System.Runtime.Remoting命名空间中的类通过序列化来间接地使用反射。using System;using System.Reflection;namespace ReflectionExampleclass Class1STAThreadstatic void Main(string args)System.Console.WriteLine(列出程序集中的所有类型);Assembly a = Assembly.LoadFrom(ReflectionExample.exe);Typ
6、e mytypes = a.GetTypes();foreach(Type t in mytypes)System.Console.WriteLine ( t.Name );System.Console.ReadLine();System.Console.WriteLine(列出HelloWorld中的所有方法);Type ht = typeof(HelloWorld);MethodInfo mif = ht.GetMethods ();foreach(MethodInfo mf in mif)System.Console.WriteLine(mf.Name);System.Console.R
7、eadLine();System.Console.WriteLine(实例化HelloWorld,并调用SayHello方法);Object obj = Activator.CreateInstance(ht);string s = ZhenLei;Object objName = Activator.CreateInstance(ht,s);/BindingFlags flags = (BindingFlags.NonPublic | BindingFlags.Public |/ BindingFlags.Static | BindingFlags.Instance | BindingFla
8、gs.DeclaredOnly);MethodInfo msayhello = ht.GetMethod(SayHello);msayhello.Invoke(obj,null);msayhello.Invoke(objName,null);System.Console.ReadLine();using System;namespace ReflectionExample/ HelloWorld 的摘要说明。/public class HelloWorldstring myName = null;public HelloWorld(string name)myName = name;publi
9、c HelloWorld() : this(null)public string Namegetreturn myName;public void SayHello()if (myName=null)System.Console.WriteLine (Hello World);elseSystem.Console.WriteLine(Hello, + myName);3、在设计模式实现中使用反射技术采用反射技术可以简化工厂的实现。(1)工厂方法:通过反射可以将需要实现的子类名称传递给工厂方法,这样无须在子类中实现类的实例化。(2)抽象工厂:使用反射可以减少抽象工厂的子类。采用反射技术可以简化工
10、厂代码的复杂程度,在.NET项目中,采用反射技术的工厂已经基本代替了工厂方法。采用反射技术可以极大地简化对象的生成,对以下设计模式的实现也有很大影响。(1)命令模式:可以采用命令的类型名称作为参数直接获得命令的实例,并且可以动态执行命令。(2)享元模式:采用反射技术实例化享元可以简化享元工厂。4.反射的概述反射的定义:审查元数据并收集关于它的类型信息的能力。元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等,。System.reflection命名空间包含的几个类,允许你反射(解析)这些元数据表的代码和反射相关
11、的命名空间(我们就是通过这几个命名空间访问反射信息):System.Reflection.MemberInfoSystem.Reflection.EventInfoSystem.Reflection.FieldInfoSystem.Reflection.MethodBaseSystem.Reflection.ConstructorInfoSystem.Reflection.MethodInfoSystem.Reflection.PropertyInfoSystem.TypeSystem.Reflection.Assembly反射的层次模型:注:层次间都是一对多的关系反射的作用:1. 可以使用反
12、射动态地创建类型的实例,将类型绑定到现有对象,或从现 有对象中获取类型2. 应用程序需要在运行时从某个特定的程序集中载入一个特定的类型,以便实现某个任务时可以用到反射。3. 反射主要应用与类库,这些类库需要知道一个类型的定义,以便提供更多的功能。应用要点:1. 现实应用程序中很少有应用程序需要使用反射类型2. 使用反射动态绑定需要牺牲性能3. 有些元数据信息是不能通过反射获取的4. 某些反射类型是专门为那些clr 开发编译器的开发使用的,所以你要意识到不是所有的反射类型都是适合每个人的。反射appDomain 的程序集当你需要反射AppDomain 中包含的所有程序集,示例如下:static
13、void Main/通过GetAssemblies 调用appDomain的所有程序集foreach (Assembly assem in Appdomain.currentDomain.GetAssemblies()/反射当前程序集的信息reflector.ReflectOnAssembly(assem)说明:调用AppDomain 对象的GetAssemblies 方法 将返回一个由System.Reflection.Assembly元素组成的数组。反射单个程序集上面的方法讲的是反射AppDomain的所有程序集,我们可以显示的调用其中的一个程序集,system.reflecton.ass
14、embly 类型提供了下面三种方法:1. Load 方法:极力推荐的一种方法,Load 方法带有一个程序集标志并载入它,Load 将引起CLR把策略应用到程序集上,先后在全局程序集缓冲区,应用程序基目录和私有路径下面查找该程序集,如果找不到该程序集系统抛出异常2. LoadFrom 方法:传递一个程序集文件的路径名(包括扩展名),CLR会载入您指定的这个程序集,传递的这个参数不能包含任何关于版本号的信息,区域性,和公钥信息,如果在指定路径找不到程序集抛出异常。3. LoadWithPartialName:永远不要使用这个方法,因为应用程序不能确定再在载入的程序集的版本。该方法的唯一用途是帮助那
15、些在.Net框架的测试环节使用.net 框架提供的某种行为的客户,这个方法将最终被抛弃不用。注意:system.AppDomain 也提供了一种Load 方法,他和Assembly的静态Load 方法不一样,AppDomain的load 方法是一种实例方法,返回的是一个对程序集的引用,Assembly的静态Load 方发将程序集按值封装发回给发出调用的AppDomain.尽量避免使用AppDomain的load 方法利用反射获取类型信息前面讲完了关于程序集的反射,下面在讲一下反射层次模型中的第三个层次,类型反射一个简单的利用反射获取类型信息的例子:1 using system;2 using
16、sytem.reflection;3 class reflecting4 5 static void Main(stringargs)6 7 reflecting reflect=new reflecting();/定义一个新的自身类8 /调用一个reflecting.exe程序集9 assembly myAssembly =assembly.loadfrom(“reflecting.exe”)10 reflect.getreflectioninfo(myAssembly);/获取反射信息11 12 /定义一个获取反射内容的方法13 void getreflectioninfo(assembl
17、y myassembly)14 15 type typearr=myassemby.Gettypes();/获取类型16 foreach (type type in typearr)/针对每个类型获取详细信息17 18 /获取类型的结构信息19 constructorinfo myconstructors=type.GetConstructors;20 /获取类型的字段信息21 fieldinfo myfields=type.GetFiedls()22 /获取方法信息23 MethodInfo myMethodInfo=type.GetMethods();24 /获取属性信息25 proper
18、tyInfo myproperties=type.GetProperties26 /获取事件信息27 EventInfo Myevents=type.GetEvents;28 29 30 其它几种获取type对象的方法:1. System.type 参数为字符串类型,该字符串必须指定类型的完整名称(包括其命名空间)2. System.type 提供了两个实例方法:GetNestedType,GetNestedTypes3. Syetem.Reflection.Assembly 类型提供的实例方法是:GetType,GetTypes,GetExporedTypes4. System.Reflec
19、tion.Moudle 提供了这些实例方法:GetType,GetTypes,FindTypes设置反射类型的成员反射类型的成员就是反射层次模型中最下面的一层数据。我们可以通过type对象的GetMembers 方法取得一个类型的成员。如果我们使用的是不带参数的GetMembers,它只返回该类型的公共定义的静态变量和实例成员,我们也可以通过使用带参数的GetMembers通过参数设置来返回指定的类型成员。具体参数参考msdn 中system.reflection.bindingflags 枚举类型的详细说明。例如:/设置需要返回的类型的成员内容bindingFlags bf=bingding
20、Flags.DeclaredOnly|bingdingFlags.Nonpublic|BingdingFlags.Public;foreach (MemberInfo mi int t.getmembers(bf)writeline(mi.membertype) /输出指定的类型成员通过反射创建类型的实例通过反射可以获取程序集的类型,我们就可以根据获得的程序集类型来创建该类型新的实例,这也是前面提到的在运行时创建对象实现晚绑定的功能我们可以通过下面的几个方法实现:1. System.Activator 的CreateInstance方法。该方法返回新对象的引用。具体使用方法参见msnd2. System.Activator 的createInstanceFrom 与上一个方法类似,不过需要指定类型及其程序集3. System.Appdomain 的方法:createInstance,CreateInstanceAndUnwrap,CreateInstranceFrom和CreateInstraceFr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 泉州工程职业技术学院《过程控制专业实验》2023-2024学年第二学期期末试卷
- 泉州纺织服装职业学院《注册电气工程师概论》2023-2024学年第二学期期末试卷
- 上海科技大学《会计制度设计》2023-2024学年第二学期期末试卷
- 商丘师范学院《信息安全攻防对抗实训》2023-2024学年第二学期期末试卷
- 兴安职业技术学院《机器学习与人工智能导论》2023-2024学年第二学期期末试卷
- 3《植物妈妈有办法》教学设计-2024-2025学年统编版语文二年级上册
- 人教版七年级历史与社会下册6.4.2-高原圣城-拉萨教学设计
- 河池2025年广西河池市事业单位招聘731人笔试历年参考题库附带答案详解
- 7微生物与健康 教学设计 -2023-2024学年科学六年级上册教科版
- 扬州环境资源职业技术学院《田径教学与实践》2023-2024学年第二学期期末试卷
- 一通三防培训课件PPT课件(PPT 53页)
- 江苏省邳州市2021-2022学年人教版四年级上册期末数学试卷(含答案)
- 大数据分析及应用实践全书课件汇总整本书电子教案(最新)
- 教练技术一阶段讲义(共59页)
- 第3章-系统模型与模型化
- 精品课程建设验收自评报告
- 福建省义务教育课程设置及比例(修订)
- 未成年人需办银行卡证明(模板)
- 建设项目职业病防护设施设计专篇编制导则
- 员工考勤流程图
- 出口加工区外汇管理培训(ppt49)
评论
0/150
提交评论