【问题标题】:Create generic class instance throws TypeLoadException创建泛型类实例抛出 TypeLoadException
【发布时间】:2012-09-03 06:32:28
【问题描述】:

我的 TestLayer 类具有命名空间:“BLL.Infrastructure.TestLayer”,并且在程序集中:“BLL”

public class LayerFactory<T, U>
{

  public static IBaseLayer<T, U> Get()
  {
       var obj = Activator.CreateInstance("BLL", "BLL.Infrastructure.TestLayer", new object[]   { (IBaseLayer<T, U>)null });


  }
}

当我运行代码时,Activator 会抛出 TypeLoadException,没有更多详细信息

这就是它应该创建的具体类:

GenericBaseLayer 实现 IBaseLayer。

public class TestLayer<T, U> : GenericBaseLayer<MyRequest, MyInfo.ActionType>
{
  public TestLayer(IBaseLayer<MyRequest, MyInfo.ActionType> layer)
            : base(layer)
   { }
}

我做错了什么?

LayerFactory 在程序集中:BLL

因此程序集必须已经加载!

更新

Type d1 = typeof(TestLayer<,>);
Type[] typeArgs = { typeof(T), typeof(U) };
Type constructed = d1.MakeGenericType(typeArgs);
var obj = Activator.CreateInstance(constructed, new object[] { (IBaseLayer<T, U>)null });

这行得通:)

【问题讨论】:

  • 异常在 InnerException 属性中有更多详细信息。 GenericBaseLayer 的静态 ctor 抛出。
  • 没有更多,InnerException为NULL
  • 好的,然后按 ctrl-alt-e 并让调试器在所有异常发生时立即中断(可能是快捷方式错误)。
  • 这有什么帮助? (oc 我试过这个技巧)我总是在 TypeLoadException 中断,因为无法加载测试层......
  • TestLayout 类需要两个通用参数,对吧?我似乎没有将它们传递给您正在调用的 CreateInstance 方法。实际上,您似乎根本没有使用那些通用参数(TestLayout 代码中的&lt;T, U&gt;),因为您将实际类型 MyRequestMyInfo.ActionType 传递给基的相应类型参数类。

标签: c# generics reflection


【解决方案1】:

指定类型名称字符串,如here:该文章建议

"System.Collections.Generic.List`1[System.String]"

List&lt;string&gt; 的字符串标识符。

如果您只在运行时知道TU,您仍然可以将Type.GetType 与泛型类型定义的字符串表示一起使用:

Type d1 = Type.GetType(yourNamespace + ".TestLayer`2");

然后您可以在d1 上致电MakeGenericType,如问题所示。

【讨论】:

  • stackoverflow.com/questions/12240407/… LOL...就在您发布之前...您的字符串参数中的“`2”是什么?
  • @Elisa:是的;起初,我试图解释这一点,但不知何故,SO 标记不允许我这样做(因为 ` 和左尖括号是特殊字符)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-03
  • 1970-01-01
  • 1970-01-01
  • 2020-04-03
  • 2010-09-09
  • 2014-05-31
相关资源
最近更新 更多