引言
前几天帮助一位网友解决了一个问题,大概是他们公司的老板做了一个项目,听他的描述项目不是很大,但是他们老板想要做到程序的解耦,也就是说他们封装了一个dll文件,在上层调用时不提供给他们引用关系,对外的设计保密,但是又想让上层使用这个dll文件,怎么办呢?我提供给他一种方法是使用反射,可能这不是最好的方法,但是很适合的方法。对于反射对于程序员来说已经不是新名词了,本文就来更深入的来讨论下反射。一、何为反射?
“反射”其实就是利用程序集的元数据信息。 反射可以有很多方法,编写程序时请先导入 System.Reflection 命名空间。
1、反射获取类中的对象
//假设你要反射一个 DLL 中的类,并且没有引用它(即未知的类型):
Assembly assembly = Assembly.LoadFile("程序集路径,不能是相对路径"); //加载程序集(EXE 或 DLL)
//或者 Assembly assembly=Assembly.LoadFrom(); //加载程序集
object obj = assembly.CreateInstance("类的完全限定名(即包括命名空间)"); //创建类的实例
2、若要反射当前项目中的类可以为
Assembly assembly = Assembly.GetExecutingAssembly(); // 获取当前程序集
object obj = assembly.CreateInstance("类的完全限定名(即包括命名空间)"); // 创建类的实例,返回为 object 类型,需要强制类型转换
3、也可以为
Type type = Type.GetType("类的完全限定名,即类的名称");
object obj = type.Assembly.CreateInstance(type);
补充:
1)反射创建某个类的实例时,必须保证使用类的完全限定名(命名空间 + 类名)。Type.GetType 方法返回 null 则意味搜索元数据中的相关信息失败(反射失败),请确保反射时使用类的完全限定名。
2)反射功能十分强大,没有什么不能实现的。若实现“跨程序集”,请使用第一种方法创建类的实例,并反射该实例的字段、属性、方法、事件... 然后动态调用之。
4、反射深层思考
.NET程序集包含模块,而模块包含类型,类型又包含成员