反射

来源:互联网 发布:美媛馆app软件下载 编辑:程序博客网 时间:2024/05/16 12:11

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

一直没有好好理解反射的真正意义在哪里,动态更换程序集(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,可以做到随时随地替换。例如机房中成功地切换了数据库。反射也有一定的弊端:类的部分属性或方法调用困难。

1 0
原创粉丝点击