反射(二)-----Assembly类
来源:互联网 发布:网民数据统计 编辑:程序博客网 时间:2024/03/29 16:45
上一篇博客写了关于反射的一些概念性和基础性的知识,这篇博客总结一下在反射中最常用的一些类的使用,我自己对于反射第一印象就是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类中还有很多常用的方法及属性,还需不断的探索和使用!
- 反射(二)-----Assembly类
- C#反射二(Assembly.LoadFrom和Assembly.LoadWithPartialName方法
- C# 反射 Type Assembly类
- C# 反射 Type Assembly类
- C# 反射 Type Assembly类
- Net反射应用(Assembly)
- 汇编语言Assembly(二)
- 反射(Assembly)
- 反射和特性-Assembly程序集类
- 关于反射机制的理解和Assembly的学习(反射机制二)
- 反射调用Assembly
- 反射Assembly.Load
- C#反射之Assembly
- C#反射Assembly 使用说明
- C#中的反射 Assembly.Load() Assembly.LoadFrom()
- java--类反射(二)
- 关于反射Assembly.Load("程序集").CreateInstance("命名空间.类")
- 关于反射Assembly.Load("程序集").CreateInstance("命名空间.类")
- 带宽流量概念
- 学习C++——返回类型
- Kaggle项目实战2—Titanic:Machine learning from disaster—排名Top20%
- Java_语法基础_内存空间及String详解
- Hadoop学习(2)-Hadoop配置与安装
- 反射(二)-----Assembly类
- OC基础--类
- USACO2.1.4 Healthy Holsteins (holstein)
- http://busumen.com/laian/30105.html 003ypqto
- 蓝桥杯 算法训练 操作格子 (线段树)
- 学习python第一天
- leetcode12 Integer to Roman
- 南京门户网 00a5gkzj
- 癫痫病治疗中心 00dnpmfi