我有一个包含两个项目的解决方案。 首先让我来描述一下我的情景。 项目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类库和MyInheritClass中的MyBaseClass)在另一个引用MyBaseclass DLL库的项目中??
我试图寻找反射,Activator却无法找到我想要的东西。也许我不知道这个的正确术语。
答案 0 :(得分:2)
假设你实际上是指Type.GetType()
(而不是Type.typeof()
,它将无法编译),那么它就会被清楚地记录为完全按照你所观察到的那样:
要获取的类型的程序集限定名称。 [...]如果类型在当前正在执行的程序集中或在Mscorlib.dll中,则提供由其名称空间限定的类型名称就足够了。
它还解释了如何修复它:将程序集的名称添加到类型名称。因此,如果您的类型在MyInheritClass
中调用,它位于MyNamespace
命名空间和MyAssembly
程序集中(通常与项目名称相同),则可以将类型名称设置为
MyNamespace.MyInheritClass, MyAssembly
它应该有用。
此外,您应该避免使用字符串作为类型名称,使用实际的Type
对象会更安全。 TypeToLoad
的格式应为Type
,而不是string
。
或者,也许,你根本不应该使用这样的设计。我不知道你为什么这样做,但我很确定有一个更好的解决方案,不涉及在这样的基类上设置静态字段。 (如果有两种类型实现相同的基类会发生什么?)