[C#反射]C#中的反射解析及使用.
1、对C#反射机制的理解2、概念理解后,必须找到方法去完成,给出管理的主要语法3、最终给出实用的例子,反射出来dll中的方法 参考:? 反射是一个程序集发现及运行的过程,通过反射可以得到*.exe或*.dll等程序集内部的信息。使用反射可以看到一个程序集内部的接口、类、方法、字段、属性、特性等等信息。在System.Reflection命名空间内包含多个反射常用的类,下面表格列出了常用的几个类。类型? ? ? ? ? ? ? ?作用? 一、System.Reflection.Assembly类???? 通过Assembly可以动态加载程序集,并查看程序集的内部信息,其中最常用的就是Load()这个方法。???? Assembly assembly=Assembly.Load("MyAssembly");???? 利用Assembly的object CreateInstance(string) 方法可以反射创建一个对象,参数0为类名。二、System.Type类Type是最常用到的类,通过Type可以得到一个类的内部信息,也可以通过它反射创建一个对象。一般有三个常用的方法可得到Type对象。利用typeof() 得到Type对象 Type type=(Example);
利用System.Object.GetType() 得到Type对象 Example example==example.GetType();
利用System.Type.GetType() 得到Type对象 Type type=Type.GetType(,,);
?? 例子:?? 我们最常见的是利用反射与Activator结合来创建对象。 Assembly assembly= Assembly.Load(=assembly.GetType( obj=Activator.CreateInstance(type);
三、反射方法? ?1.通过 System.Reflection.MethodInfo能查找到类里面的方法 Type type= MethodInfo[] listMethodInfo= (MethodInfo methodInfo Cosole.WriteLine(+methodInfo.Name);
2.我们也能通过反射方法执行类里面的方法2.我们也能通过反射方法执行类里面的方法 Assembly assembly= Assembly.Load( Type type=assembly.GetType( obj= MethodInfo methodInfo=type.GetMethod();
methodInfo.Invoke(obj,);
四、反射属性1.通过 System.Reflection.PropertyInfo 能查找到类里面的属性? ?常用的方法有GetValue(object,object[]) 获取属性值和 SetValue(object,object,object[]) 设置属性值 Type type= PropertyInfo[] listPropertyInfo= (PropertyInfo propertyInfo Cosole.WriteLine(+ propertyInfo.Name);
2.我们也可以通过以下方法设置或者获取一个对象的属性值2.我们也可以通过以下方法设置或者获取一个对象的属性值 Assembly assembly=Assembly.Load( Type type=assembly.GetType( obj= PropertyInfo propertyInfo=obj.GetProperty();
name=propertyInfo.GetValue(obj,);
PropertyInfo propertyInfo2=obj.GetProperty();
propertyInfo.SetValue(obj,,);
五、反射字段??? 通过 System.Reflection.FieldInfo 能查找到类里面的字段??? 它包括有两个常用方法SetValue(object,object )和GetValue(object)? 因为使用方法与反射属性非常相似,在此不再多作介绍六、反射特性?? 通过System.Reflection.MemberInfo的GetCustomAttributes(Type,bool)就可反射出一个类里面的特性,以下例子可以反射出一个类的所有特性 Type type=( [] typeAttributes=type.GetCustomAttributes();
( attribute Console.WriteLine(+attribute.ToString());
通过下面例子,可以获取Example类Name属性的所有特性通过下面例子,可以获取Example类Name属性的所有特性 publics {;
Type type = PropertyInfo propertyInfo=type.GetProperty();
( attribute propertyInfo.GetCustomAttributes())
Console.WriteLine(“Property attribute:
总结: Assembly.Load()方法,Assembly.LoadFrom()方法,Assembly.LoadFile()方法的区别在C#中,我们要使用反射,首先要搞清楚以下命名空间中几个类的关系:??? System.Reflection命名空间??? (1)?? AppDomain:应用程序域,可以将其理解为一组程序集的逻辑容器??? (2)?? Assembly:程序集类??? (3)?? Module:模块类??? (4)?? Type:使用反射得到类型信息的最核心的类??? 他们之间是一种从属关系,也就是说,一个AppDomain可以包含N个Assembly,一个Assembly可以包含N个Module,而一个Module可以包含N个Type. 1,Assembly.Load()??? 这个方法通过程序集的长名称(包括程序集名,版本信息,语言文化,公钥标记)来加载程序集的,会加载此程序集引用的其他程序集,一般情况下都应该优先使用 这个方法,他的执行效率比LoadFrom要高很多,而且不会造成重复加载的问题(原因在第2点上说明)??? 使用这个方法的时候, CLR会应用一定的策略来查找程序集,实际上CLR按如下的顺序来定位程序集:??? ⑴如果程序集有强名称,在首先在全局程序集缓(GAC)中查找程序集。??? ⑵如果程序集的强名称没有正确指定或GAC中找不到,那么通过配置文件中的 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |