0

我有一个包含两个项目的解决方案。首先让我描述一下我的场景。项目 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.Instance 创建和实例化 MyInheritClass 而不必在同一个项目中拥有这两个类(基础 DLL 类库中的 MyBaseClass 和另一个项目中的 MyInheritClass引用 MyBaseclass DLL 库)?

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

4

1 回答 1

2

假设您实际上的意思是Type.GetType()(而不是Type.typeof(),它不会编译),那么它被清楚地记录为正在做您正在观察的事情:

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

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

MyNamespace.MyInheritClass, MyAssembly

它应该可以工作。

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

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

于 2012-03-27T01:15:10.560 回答