是否可以在将自身指定为泛型类型参数的同时发出从泛型类型派生的类型?

时间:2009-09-14 12:06:33

标签: .net generics reflection.emit

想象一下以下完全合法的类型层次结构:

class A<T> where T : A<T>
{
}

class B : A<B>
{
  public B():base(){}
}

我的问题是A&lt;&gt;的静态编译定义。是否可以动态发出类型B?

问题是如何在ModuleBuilder.DefineType中指定父类型。

或者除了

之外,还有另一种方法可以产生这样的类型
  • 使用上述方法
  • 使用CodeDom(这与创建临时文件并将其传递给csc.exe非常相似: - ))

修改 类型B应该有显式公共默认构造函数,调用从A<B>继承的默认构造函数。

1 个答案:

答案 0 :(得分:4)

您可以使用未指定父类型的ModuleBuilder.DefineType重载,然后使用TypeBuilder.SetParent方法将父级设置为递归类型(使用{{1}之类的参数其中typeof(A<>).MakeGenericType(tb)是你的tb,但我面前没有C#编译器。)

编辑 - 这是一个有效的例子,假设您有一个TypeBuilder。对于空的默认构造函数,您根本不需要使用ModuleBuilder mb方法;或者你可以使用DefineConstructor。我已经包含了一个示例,其中显式调用了基本构造函数,但是,如果你想在其中添加一些额外的逻辑。

DefineDefaultConstructor