上一篇博客写了关于反射的一些概念性和基础性的知识,这篇博客总结一下在反射中最常用的一些类的使用,我自己对于反射第一印象就是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类中还有很多常用的方法及属性,还需不断的探索和使用!