繁体   English   中英

Activator.CreateInstance与继承的类不在同一个项目中

[英]Activator.CreateInstance with inherited class not in the same project

我有一个包含两个项目的解决方案。 首先让我来描述一下我的情景。 项目1:持有一个基类调用MyBaseClass,其中包含以下两个我感兴趣的属性和方法:

TypeToLoad - 要使用简单的get / set功能实例化的继承类的静态字符串属性。

Instance - 静态属性,返回TypeToLoad中指定类型的MyBaseClass实例,代码如下:

public static MyBaseClass Instance{
   return (MyBaseClass)Activator.CreateInstance(Type.typeof(TypeToLoad));
}

现在在第二个项目中,我继承了MyBaseClass,如下所示(当然还添加了适当的命名空间和引用)。

public class MyInheritClass : MyBaseClass {
    //implements all other functions of MyBaseClass;
}

和我的其他代码文件之一,在与MyInheritClass相同的项目中,我有以下几行代码:

Type myType = Type.typeof("MyInheritClass"); //returns the correct "Type"
MyBaseClass.TypeToLoad = "MyInheritClass";
MyBaseClass myInstance = MyBaseClass.Instance; //Errors... because Type.typeof(...) could not resolve "MyInheritClass".

当我将MyInheritClass代码文件移动到与MyBaseClass相同的项目时,代码运行得很好。

我的问题是,无论如何通过设置MyBaseClass.TypeToLoad =“MyInheritClass”使用MyBaseClass.Instance来创建和实例MyInheritClass,而不必在同一个项目中有这两个类(基本DLL类库中的MyBaseClass和另一个项目中的MyInheritClass)引用MyBaseclass DLL库)?

我试图搜索反射,Activator但无法找到我想要的东西。 也许我不知道这个的正确术语。

假设你实际上是指Type.GetType() (而不是Type.typeof() ,它将无法编译),那么它清楚地记录为完全正在你所观察到的:

要获取的类型的程序集限定名称。 [...]如果类型在当前正在执行的程序集中或在Mscorlib.dll中,则提供由其名称空间限定的类型名称就足够了。

它还解释了如何修复它:将程序集的名称添加到类型名称。 因此,如果您的类型在MyInheritClassMyInheritClass ,它位于MyNamespace命名空间和MyAssembly程序MyNamespace (通常与项目名称相同),您可以将类型名称设置为

MyNamespace.MyInheritClass, MyAssembly

它应该工作。

此外,您应该避免使用字符串作为类型名称,使用实际的Type对象会更安全。 TypeToLoad应为Type ,而不是string

或者,也许,你根本不应该使用这样的设计。 我不知道你为什么这样做,但我很确定有一个更好的解决方案,不涉及在这样的基类上设置静态字段。 (如果有两种类型实现相同的基类,会发生什么?)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM