具有继承类的Activator.CreateInstance不在同一项目中

本文关键字:项目 CreateInstance 继承 Activator | 更新日期: 2023-09-27 18:29:08

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

TypeToLoad-静态字符串属性,它继承了要用简单的获取/设置功能实例化的类。

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.Istance创建MyInheritClass的实例,而不必在同一项目中拥有这两个类(基准DLL类库中的MyBaseClass和引用MyBaseClass DLL库的另一项目中的MyInheritClass)?

我试着搜索反射,Activator,但没能找到我要找的东西。也许我不知道正确的术语。

具有继承类的Activator.CreateInstance不在同一项目中

假设你指的是Type.GetType()(而不是Type.typeof(),它不会编译),那么它就被清楚地记录为正在做你所观察到的事情:

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

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

MyNamespace.MyInheritClass, MyAssembly

它应该起作用。

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

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