实例总结C反射基础知识[原创]

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

C#反射知识2020-1-3李银锁收集期望理解反射到实体-1-13本文中部分内容参考自:1.ProC#with.NET3.0SpecialEdition2.本文中所有源代码下载链接:一、基本概念反射:反射是一个运行库类型发现的过程。通过反射可以得到一个给定程序集所包含的所有类型的列表,这个列表包括给定类型中定义的方法、字段、属性和事件。也可以动态的发现一组给定类支持的借口、方法的参数和其他相关信息如基类、命名空间、数据清单等。二、命名空间1.System.Reflection命名空间内的各类型(1)Assembly通过它可以加载、了解和操纵一个程序集(2)AssemblyName通过它可以找到大量隐藏在程序集的身份中的信息,如版本信息、区域信息等(3)EventInfo事件的信息(4)FieldInfo字段的信息(5)MethodInfo方法的信息(6)ParameterInfo参数的信息(7)PropertyInfo属性的信息(8)MemberInfo是抽象基类,为EventInfo、FieldInfo、MethodInfo、PropertyInfo等类型定义了公共的行为。(9)Module用来访问带有多文件程序集的给定模块2.System.Type类System.Type支持的成员可以分为这样几类(1)Is***用来检查一个类型的元数据,如IsAbstract、IsClass、IsValueType等等(2)Get***用来从类型得到指定项目,如GetEvent()得到类型的一个指定的事件(EventInfo)。另外,这些方法都有一个单数版本和一个复数版本。如GetEvent()对应有一个复数版本GetEvents(),该方法返回一个相关的EventInfo数组(3)FindMembers()根据查询条件返回一个MemberInfo类型的数组(4)GetType()该静态方法根据一个字符串名称返回一个Type实例(5)InvokeMember()对给定项目进行晚期绑定3.得到一个Type类型实例的三种方法(因为Type是一个抽象类,所以不能直接使用new关键字创建一个Type对象)(1)使用System.Object.GetType()e.g:Personpe=newPerson();//---------定义pe为person类的一个对象Typet=pe.GetType();(2)使用System.Type.GetType()静态方法,参数为类型的完全限定名e.g:Typet=Type.GetType(Entity.Person);该方法被重载,允许指定两个布尔类型的参数,一个用来控制当前类型不能找到时是否抛出异常,另一个用来指示是否区分字符串大小写Typet=Type.GetType(Entity.Person,false,true);注意到传入的字符串并没有包含类型所在的程序集信息,此时该类型便被认为是定义在当前执行的程序集中的。要得到一个外部私有程序集的类型元数据时,字符串参数必须使用类型完全限定名加上类型所在程序集的友好名字e.g:Typet=Type.GetType(Entity.Person,Entity);//------Entity即为类型所在程序集的友好名字嵌套类型:传入的字符串可以指定一个+标记来表示一个嵌套类型,如希望得到一个嵌套在person类中的枚举类型City的类型信息,C#反射知识2020-1-3李银锁收集期望理解反射到实体-2-13则可以这样e.g:Typet=Type.GetType(Entity.person+City);(3)使用typeof运算符e.g:Typet=typeof(person);三种方法的比较:使用第一种方法必须先建立一个实例,而后两种方法不必先建立实例。但使用typeof运算符仍然需要知道类型的编译时信息,而使用System.Type.GetType()静态方法不需要知道类型的编译时信息,所以是首选方法。下面是一个实例,简单的运用了前面介绍的知识,实现了对一个Type对象的反射,包括反射其所有可见字段、方法、属性、事件。反射类型的基本属性。并将其中一个方法的详细信息列了出来【源代码】1usingSystem;2usingSystem.Collections.Generic;3usingSystem.Linq;4usingSystem.Text;5usingSystem.Reflection;67usingSystem.Collections;//--------要实现IEnumerable接口则必须制定该命名空间10namespaceExercise11{12publicclassBasePerson//-------------假设一个基类,定义了一个公共方法和一个私有方法13{14publicvoidBasePublic()15{16}18privatevoidBasePrivate()19{20}2122};232425//Person类实现了接口IEnumerable,使得类中定义的Array数组能够使用foreach枚举26publicclassPerson:BasePerson,IEnumerable27{28privatestringname=林田惠;//---姓名29publicintage=20;//---年龄3031Arraychildren=null;//---子女数组3233Person()34{35}37Person(stringa,intb)38{39Name=a;40Age=b;41}C#反射知识2020-1-3李银锁收集期望理解反射到实体-3-1344publicstringName45{46get{returnname;}47set{}48}50publicintAge51{52get{returnage;}53set{}54}56publicvoidAddAge()//---自增一岁的方法57{58Age+=1;59}62publicdelegatevoidPersonNameHandler(stringx);63publiceventPersonNameHandlerOnChangeName;//------定义了一个改变姓名的事件65publicvoidChangeName(stringnam)//---改名的方法66{67Name=nam;68}70publicvoidChangeNameAndAddAge(stringname,intage)//具有两个参数的方法,用来演示反射具体方法的详细情况71{72this.Name=name;73this.Age+=age;74}76publicIEnumeratorGetEnumerator()//---实现接口77{78returnchildren.GetEnumerator();79}81}85publicclassProgram86{89构建自定义元数据查看器#region构建自定义元数据查看器91//-------------显示传入类型拥有的方法名称92publicstaticvoidListMethods(Typet)93{94Console.WriteLine(\n该类型的所有方法:);95MethodInfo[]mi=t.GetMethods();96foreach(MethodInfominmi)97{98Console.WriteLine(\t方法名:{0},m.Name);99}100}103//-------------显示一个方法的所有参数信息104publicstaticvoidListParameters(MethodInfom)105{C#反射知识2020-1-3李银锁收集期望理解反射到实体-4-13106ParameterInfo[]pi=m.GetParameters();107foreach(ParameterInfopinpi)108{109Console.WriteLine(参数名:{0}\t参数类型:{1},p.Name,p.ParameterType);110}111}114//-------------显示一个特定方法的详细情况115publicstaticvoidListMethodDetail(Typet,stringMethodName)116{117MethodInfom=t.GetMethod(MethodName);118Console.WriteLine(\n显示方法详情\n方法名称:{0},MethodName);119Console.WriteLine(方法返回值类型:{0},m.ReturnType.FullName);120ListParameters(m);122}124//------------显示传入类型拥有的字段名称125publicstaticvoidListFields(Typet)126{127Console.WriteLine(\n该类型的所有字段:);128FieldInfo[]fi=t.GetFields();129foreach(FieldInfofinfi)130{131Console.WriteLine(\t字段名:{0},f.Name);132}133}135//------------显示传入类型拥有的属性名称136publicstaticvoidListProperties(Typet)137{138Console.WriteLine(\n该类型的所有属性:);139PropertyInfo[]pi=t.GetProperties();140foreach(PropertyInfopinpi)141{142Console.WriteLine(\t属性名:{0},p.Name);143}144}147//------------显示传入类型拥有的基类名称148publicstaticvoidListInterFaces(Typet)149{150Console.WriteLine(\n该类型的所实现的接口:);151Type[]ii=t.GetInterfaces();//-----------对GetInterfaces()的调用返回一个Type类型的数组(说明其实接口也是一种类型)152foreach(Typepinii)153{154Console.WriteLine(\t接口名:{0},p.Name);155}156}157C#反射知识2020-1-3李银锁收集期望理解反射到实体-5-13158//------------显示传入类型拥有的属性名称159publicstaticvoidListEvents(Typet)160{161Console.WriteLine(\n该类型的所有事件名:);162EventInfo[]ei=t.GetEvents();163foreach(EventInfoeinei)164{165Console.WriteLine(\n事件名:{0},e.Name);166}167}169//------------各种其他信息170publicstaticvoidListOtherInfo(Typet)171{172Console.WriteLine(基类名称:{0},t.BaseType);173Console.WriteLine(基类的基类的名称:{0},t.BaseType.BaseType);174Console.WriteLine(是一个类吗?:{0},t.IsClass);175Console.WriteLine(是一个抽象类吗?:{0},t.IsAbstract);176}1

1 / 13
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功