- 背景知识
-
System.Reflection.Assembly类有两个静态方法:Assembly.Load(string assemblyname)和Assembly.LoadFrom(string filename) 。通常用这两个方法把程序集加载到应用程序域中。 如果你希望加载的程序集超出了CLR的预定探查范围,你可以用 Assembly.LoadFrom直接从一个文件位置加载程序集。
抽象类不可以被直接实例化,但是可以从其子类实例化。可以参考相关李氏替换原则(LSP)的知识;
- 实例代码
-
背景知识 类关系图如下,其中Person为抽象类。
-
Person person = null ;
American american = new American();
person = american as Person; - 你能说美国人不是人吗 ?
- 好,如果这个对象是反射创建的对象是什么情况(至于为什么要用反射创建对象,可以参考相关工厂设计模式的文章)?
-
Code
- 注意这个Server.dll物理位置不在当前程序域范围而。 运行程序,你会发现,你得到的p对象为null?不信,你测试下。
- 问题在哪里
-
说句实话,我发这篇文章的目的就是想让大家讨论下,问题就究竟处在哪里?
注意,上面的代码如果你把Server.dll的物理位置修改成当前的应用程序目录下p就可以进行转化。 我把两中方式的Client.exe进行Refalctor查看IL,没有任何差别。 那就是一种可能:
当前在Demo.Client中声明的Person p,托管平台为是加载的dll中创建的 American的父类。 - bool isPerson = objInstance is Person;
-
即我们前文提到的超出了CLR的预定探查范围,如果真的是这样,对于“李氏替换原则”有什么好的解决办法?
欢迎讨论 , 代码下载;