Activator.CreateInstance与继承的类不在同一个项目中

时间:2012-03-27 00:07:49

标签: c# .net inheritance reflection activator

我有一个包含两个项目的解决方案。 首先让我来描述一下我的情景。 项目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却无法找到我想要的东西。也许我不知道这个的正确术语。

1 个答案:

答案 0 :(得分:2)

假设你实际上是指Type.GetType()(而不是Type.typeof(),它将无法编译),那么它就会被清楚地记录为完全按照你所观察到的那样:

  

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

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

MyNamespace.MyInheritClass, MyAssembly

它应该有用。

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

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