具有继承类的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,但没能找到我要找的东西。也许我不知道正确的术语。
假设你指的是Type.GetType()
(而不是Type.typeof()
,它不会编译),那么它就被清楚地记录为正在做你所观察到的事情:
要获取的类型的程序集限定名。[…]如果类型在当前执行的程序集中或Mscorlib.dll中,则提供由其命名空间限定的类型名称就足够了。
它还解释了如何修复它:将程序集的名称添加到类型名称中。因此,如果您的类型是在MyInheritClass
中调用的,它在MyNamespace
命名空间和MyAssembly
程序集中(通常与项目名称相同),您可以将类型名称设置为
MyNamespace.MyInheritClass, MyAssembly
它应该起作用。
此外,您应该避免使用字符串作为类型名称,使用实际的Type
对象要安全得多。TypeToLoad
的类型应该是Type
,而不是string
。
或者,也许,你根本不应该使用这样的设计。我不知道你为什么要这样做,但我确信有一个更好的解决方案,不需要在这样的基类上设置静态字段。(当您有两个实现相同基类的类型时会发生什么?)