• 反射


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

    一直没有好好理解反射的真正意义在哪里,动态更换程序集(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的路径载入默认bindebug下的dll

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

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

     

     

    分析:

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

     

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

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

     

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

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

  • 相关阅读:
    Linux系统分支之Ubuntu
    运维工具之Netdata
    Antd Tree组件虚拟滚动空白问题
    没有root权限的情况下安装vim
    C++ / Python测量程序执行时间
    Linux dmidecode 命令介绍
    网卡到底是什么
    flannel的革命性的变化是在哪里呢?
    kube-proxy
    cilium
  • 原文地址:https://www.cnblogs.com/cxchanpin/p/6932785.html
Copyright © 2020-2023  润新知