【问题标题】:Activator.CreateInstance with inherited class not in the same projectActivator.CreateInstance 与继承的类不在同一个项目中
【发布时间】:2012-03-27 00:07:48
【问题描述】:

我有一个包含两个项目的解决方案。 首先让我描述一下我的场景。 项目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,但无法找到我要查找的内容。也许我不知道正确的术语。

【问题讨论】:

  • 顺便说一句,你真的应该使用像.netc# 这样的描述性标签。如果你这样做了,你很可能会很快得到答案。

标签: c# .net inheritance reflection activator


【解决方案1】:

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

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

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

MyNamespace.MyInheritClass, MyAssembly

它应该可以工作。

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

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

【讨论】:

  • 嗨 svick,你对我输入 Type.TypeOf() 而不是 Type.GetType() 的错误是完全正确的。
  • 我朝这个方向发展的目的是因为我有一组提供程序,它们将成为我的基础/核心,具有默认功能。对于我拥有的每个客户,我将根据需要继承这些提供程序,并在需要的地方覆盖它们的虚拟方法,并在配置文件中将提供程序类型指向正确的客户提供程序类。而且我不想将所有客户聚集到同一个程序集中,因为让客户 A 的库也包含客户 B 的代码是没有意义的。
  • 想象一下,如果客户端数量达到 100+,管理代码集将是地狱。通过直接进入,它使我能够在他们自己的项目上分别开发每个客户端提供程序,并将 DLL 转储到他们的客户端应用程序中,并将提供程序指向客户端的类。类似于会员提供者的东西。感谢您的解决方案/建议。我一定会试一试,并会对此给予反馈。我很漂亮,其他人也有同样的问题。再次非常感谢您。 Thinh P. Nguyen
  • svick,您的解决方案就像一个魅力。我所要做的就是在配置文件中将参数从 更改为 你可以看出这是一个网站项目。
  • 我并不是说您应该将所有代码放在同一个程序集中。我只是说您可能想使用不同的方法来设置要使用的实现。您是否看过 IoC 容器,例如 Castle Windsor
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多