上一篇博客写了关于反射的一些概念性和基础性的知识,这篇博客总结一下在反射中最常用的一些类的使用,我自己对于反射第一印象就是Assembly,那么它到底是什么意思,有哪些功能呢?总结一下Assembly中最常用的属性和方法
Assembly:
1、常用方法:
CreateInstance:从字面意思上看,是创建实例,在Assembly中对其进行了多重实现,最常用的便是:
CreateInstance(String):使用区分大小写的搜索,从此程序集中查找指定的类型,然后使用系统激活器创建它的实例。
实际应用:Assembly.Load().CreateInstance(String)在抽象工厂中通过加载对应的程序集来创建相应的实例。
Equals:确定此程序集和指定的对象是否相等
GetAssembly:获取在其中定义指定类的当前加载的程序集。
GetCustomAttributes:它也进行了重载,可以返回所有自定义属性集,也可以返回指定类型的自定义属性集
GetModule:获取程序集中指定的模块,GetModules:获取所有模块
GetType(),GetType(String):获取当前实例的type,而通过String参数,则可获取具有指定名称的实例的type
应用:
public System.Type TestReflection() { Assembly ass = Assembly.LoadFrom(Server.MapPath("../bin/ITOO.Basic.CommonModel.dll")); System.Type t = ass.GetType("ITOO.Basic.CommonModel.SchoolLevel"); // object o = System.Activator.CreateInstance(t); return t; }那么最终获得t的值:
当然,我们可以不指定具体的类型,对dll中的类型进行遍历,以字符串的形式输出,会将所有dll中所包含的类型名称一一打印出来。
foreach (var types in ass.GetTypes()) { string typeStr =types.ToString(); s += typeStr; //string name = types.Name; //s +=name+" "; } return s;
通过types.Name来直接获取类的名称,还有就是Load方法系列,LoadForm,LoadFrom等都是为加载程序集使用的。通过指定具体的路径或名称来加载
在Assembly中还有比较常用的扩展方法:GetCustomAttribute(获取自定义属性集合
以上这些是通过在UI系统中接触到的,上传dll要进行解析,而解析的过程通过反射,也主要是Assembly中的方法来进行解析,这里就把代码直接贴过来啦。
public class LoadDLL { private Assembly ass = null; /// <summary> /// 加载dll /// </summary> /// <param name="dllPath">dll文件路径</param> public LoadDLL(string dllPath) { this.ass = Assembly.LoadFrom(dllPath); //利用dll的路径加载(fullname) } /// <summary> /// 返回反射的dll /// </summary> /// <returns></returns> public Assembly GetAssembly() { return this.ass; } /// <summary> /// 获取该程序集所引用的所有程序集 /// </summary> /// /// <returns></returns> public AssemblyName[] GetReferencedAssemblies() { return ass.GetReferencedAssemblies(); } /// <summary> /// 获取程序集定义的类型 /// </summary> /// /// <returns></returns> public Type[] GetTypes() { Type[] types = ass.GetTypes(); string name = types[0].Name; return types; } /// <summary> /// 获取程序集清单文件表中的文件 /// </summary> /// /// <returns></returns> public FileStream[] GetFiles(bool ishert = true) { return ass.GetFiles(ishert); } /// <summary> /// 获取程序集下的所有模块 /// </summary> /// <param name="getResourceModules">是否获取资源模块</param> /// <returns></returns> public Module[] GetModules(bool getResourceModules = false) { return ass.GetModules(getResourceModules); } /// <summary> /// 获取程序集清单文件表中一部分加载的模块 /// </summary> /// <returns></returns> public Module[] GetLoadedModules() { return ass.GetLoadedModules(); } /// <summary> /// 获取程序集清单文件表中的所有资源名称 /// </summary> /// /// <returns></returns> public string[] GetManifestResourceNames() { return ass.GetManifestResourceNames(); } /// <summary> /// 获取程序集清单文件表中的所有自定义属性 /// </summary> /// <param name="ishert">是否获取集成的属性</param> /// <returns></returns> public object[] GetCustomAttributes(bool ishert = true) { return ass.GetCustomAttributes(ishert); } }最开始,对反射不是很了解,咋一看,还以为自己定义了个实体呢?但是实体中的一些方法却不是自己定义的,后来才发现是通过反射,组成了这么一个类,来包含对解析dll中的一些操作的方法。在Controller中有通过定义了一个LoadEntityDll(string path)来获取dll中实体类的名称。
以上是UI中用到的一些关于反射的一些代码段,具体怎么解析实体中的属性和字段,就要用到反射中另一个常用的类PropertyInfo这个类了,留在下篇博客总结。Assembly类中还有很多常用的方法及属性,还需不断的探索和使用!