反射
来源:互联网 发布:美媛馆app软件下载 编辑:程序博客网 时间:2024/05/16 12:11
最初认识的反射,脑海里只有命名空间和程序集的概念,认为只要知道类所在的命名空间和程序集的名称,就能实例化所需要的类。
一直没有好好理解反射的真正意义在哪里,动态更换程序集(dll)。
不将dll添加引用到引用列表中,就可以做到动态更换程序集。
反射加载程序集的几种方法
- 不引用相应的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");
- 引用相应的dll,通过默认的路径加载(此种方法运用反射就没有意义了,因为已经做不到动态更换dll了)
Assemblyassembly = Assembly.Load("ITOO_DAL");
- 改变dll的生成路径,通过默认的路径加载
//通过改变ITOO_DAL文件dll的路径加载默认bin\debug\下的dll
Assembly assembly =Assembly.Load("ITOO_DAL");
常规的引用方式,可以在程序中通过命名空间获取类,方法,属性
分析:
- 通过引用dll到相应的引用列表中,我们是无法做到在程序发布后,动态更换dll的(我们常规的通过 Using(Import) 命名空间的缺陷)
- 但是与传统方式引用dll,在代码中Using(Import)命名空间相比,反射得到的类,实例化和调用都很困难。
- 解决方案,利用上一层的接口进行强转,但是这样只能调用类中的公有方法,私有方法和静态方法,属性还是无法直接调用(接口是一组方法的集合)
- 解决方案二:利用抽象类进行强转,既可以调到其中的公有属性也可以调到其中的公有方法,父类中的静态方法也可以成功被调用,但是子类中的静态方法还是不能被调用
综上(个人见解):反射应用的最适合的一种场景是:针对接口或抽象类编程,并且,接口和实现不在同一个项目中,此时负责具体实现的程序集dll,可以做到随时随地替换。例如机房中成功地切换了数据库。反射也有一定的弊端:类的部分属性或方法调用困难。
1 0
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 使用正则表达式限制文本框输入格式
- MySQL执行计划解读
- 上李邕(yong1)
- 请教如何在数据绑定时不让combox控件触发SelectedIndexChanged事件,
- HDU 5325 Crazy Bobo(思路+dfs 记忆化)
- 反射
- 更改MFC标题栏图标和生成的执行文件图标
- 交叉编译expect
- c++类成员变量初始化的一种方法
- Linux下Python 及Pexpect 的安装【自己留存】
- Cloneable Interface in java
- read text file DEMO
- hdu 1856 More is better
- Java基础