zl程序教程

您现在的位置是:首页 >  后端

当前栏目

反射

2023-09-11 14:14:10 时间

最初认识的反射,脑海里仅仅有命名空间和程序集的概念,觉得仅仅要知道类所在的命名空间和程序集的名称,就能实例化所须要的类。

一直没有好好理解反射的真正意义在哪里,动态更换程序集(dll)。

不将dll加入引用到引用列表中。就能够做到动态更换程序集。

反射载入程序集的几种方法

  1. 不引用对应的dll。通过绝对路径载入

                        //通过绝对路径载入程序集方法一

           

Assemblyassembly=Assembly.LoadFile("E:\\高效平台\\基础3.0\\ITOO3.1技术分享\\反射\\ITOO_Reflection\\ITOO_Reflection\\ITOO_DAL\\bin\\Debug\\ITOO_DAL.dll");

 

           //通过绝对路径载入程序集方法二

           

Assembly assembly =Assembly.LoadFrom("E:\\高效平台\\基础3.0\\ITOO3.1技术分享\\反射\\ITOO_Reflection\\ITOO_Reflection\\ITOO_DAL\\bin\\Debug\\ITOO_DAL.dll");

           //通过绝对路径载入程序集方法三

           

Assembly assembly =Assembly.ReflectionOnlyLoadFrom("E:\\高效平台\\基础3.0\\ITOO3.1技术分享\\反射\\ITOO_Reflection\\ITOO_Reflection\\ITOO_DAL\\bin\\Debug\\ITOO_DAL.dll");

          

 

  1. 引用对应的dll,通过默认的路径载入(此种方法运用反射就没有意义了,由于已经做不到动态更换dll了)

 

Assemblyassembly = Assembly.Load("ITOO_DAL");

  1. 改变dll的生成路径,通过默认的路径载入

   //通过改变ITOO_DAL文件dll的路径载入默认bin\debug\下的dll

     Assembly assembly =Assembly.Load("ITOO_DAL");

常规的引用方式,能够在程序中通过命名空间获取类,方法,属性

 

 

分析:

  1. 通过引用dll到对应的引用列表中。我们是无法做到在程序公布后,动态更换dll的(我们常规的通过 Using(Import) 命名空间 的缺陷)

 

  1. 可是与传统方式引用dll,在代码中UsingImport)命名空间相比,反射得到的类,实例化和调用都非常困难。

    1. 解决方式。利用上一层的接口进行强转,可是这样仅仅能调用类中的公有方法,私有方法和静态方法,属性还是无法直接调用(接口是一组方法的集合)
    1. 解决方式二:利用抽象类进行强转,既能够调到当中的公有属性也能够调到当中的公有方法,父类中的静态方法也能够成功被调用。可是子类中的静态方法还是不能被调用

 

综上(个人见解):反射应用的最适合的一种场景是:针对接口或抽象类编程,而且,接口和实现不在同一个项目中,此时负责详细实现的程序集dll,能够做到随时随地替换。比如机房中成功地切换了数据库。

反射也有一定的弊端:类的部分属性或方法调用困难。