[英]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中,则提供由其名称空间限定的类型名称就足够了。
它还解释了如何修复它:将程序集的名称添加到类型名称。 因此,如果您的类型在MyInheritClass
中MyInheritClass
,它位于MyNamespace
命名空间和MyAssembly
程序MyNamespace
(通常与项目名称相同),您可以将类型名称设置为
MyNamespace.MyInheritClass, MyAssembly
它应该工作。
此外,您应该避免使用字符串作为类型名称,使用实际的Type
对象会更安全。 TypeToLoad
应为Type
,而不是string
。
或者,也许,你根本不应该使用这样的设计。 我不知道你为什么这样做,但我很确定有一个更好的解决方案,不涉及在这样的基类上设置静态字段。 (如果有两种类型实现相同的基类,会发生什么?)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.