福福dy8,永无止境第一季,功夫派红人堂
reflection; 程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。我们可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,就可以调用类型的方法或访问其字段和属性。
下图很好的解释了程序集和模块,类型等之间的关系:
//assembly通过此类可以加载操纵一个程序集,并获取程序集内部信息 assembly assembly = assembly.load("myassembly"); //引用命名空间 assembly assembly2 = assembly.loadfrom("d:\testdll.dll"); assembly dll = assembly.loadfile(environment.currentdirectory + "\\testdll.dll"); //通过dll文件去反射其中所有的类型,但不会加载引用的程序集
type math = type.gettype("testdll.math", true); //获取类型 methodinfo method = math.getmethod("add"); //获取testdll.math中的方法add int count = (int)method.invoke(null, new object[] { 10, 20 }); //给add方法传参数并去调用方法add console.writeline("invoke method:" + count.tostring()); console.readline();
assembly dll = assembly.loadfile(environment.currentdirectory + "\\testdll.dll"); //通过dll文件去反射其中所有的类型,但不会加载引用的程序集 //environment.currentdirectory 属性:获取或设置当前工作目录的完全限定路径 type math = dll.gettype("testdll.math", true); //获取类型 methodinfo method = math.getmethod("add"); //获取testdll.math中的方法add int count = (int)method.invoke(null, new object[] { 10, 20 }); //给add方法传参数并去调用方法add console.writeline("invoke method:" + count.tostring()); console.readline();
在不用反射+配置文件时,抽象工厂的问题是:
*如果需要增加多个,就要增加多个类,更麻烦。
在使用反射+配置文件后,抽象工厂的改变是:
*如果需要更换数据库,不需改变代码,只需要修改配置文件中db的值。
小结:反射技术的使用去除了switch或if,解除分支判断的耦合。在这里,反射可以说是简化了工厂的实现。
//ef:就是让ef上下文保存了一下。不适合于集群(后期使用key,value保存在分布式缓存中,key为guid) public int savechanges() { //return dbcontextfactory.getcurrentdbcontext().savechanges(); string strassembly = configurationmanager.appsettings["dalassembly"]; string strdbcontextfactoryclassfullename = configurationmanager.appsettings["dbcontextfactoryclassfullename"]; assembly assembly = assembly.load(strassembly); type type = assembly.gettype(strdbcontextfactoryclassfullename); methodinfo methodinfo = type.getmethod("getcurrentdbcontext"); return ((dbcontext)methodinfo.invoke(null, null)).savechanges(); }
反射与引用
相比较下,引用执行效率高,但是当你引用的dll文件很多的时候,一遍遍的引用dll...,那就不是什么好事了。 反射呢,虽执行效率低,但在上述情况出现时,它只需动态反射一次dll文件,不用去管dll文件时新增还是减少的情况了,有点一劳永逸的味道。
在真正用的过程中,反射回合委托,泛型,特性等等结合使用,这都是需要进一步研究学习的地方
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
asp.net搭建博客,使用BlogEngine.NET+MySql搭建博客
网友评论