想象一下以下完全合法的类型层次结构:
class A<T> where T : A<T>
{
}
class B : A<B>
{
public B():base(){}
}
我的问题是A&lt;&gt;的静态编译定义。是否可以动态发出类型B?
问题是如何在ModuleBuilder.DefineType
中指定父类型。
或者除了
之外,还有另一种方法可以产生这样的类型 修改
类型B
应该有显式公共默认构造函数,调用从A<B>
继承的默认构造函数。
答案 0 :(得分:4)
您可以使用未指定父类型的ModuleBuilder.DefineType
重载,然后使用TypeBuilder.SetParent
方法将父级设置为递归类型(使用{{1}之类的参数其中typeof(A<>).MakeGenericType(tb)
是你的tb
,但我面前没有C#编译器。)
编辑 - 这是一个有效的例子,假设您有一个TypeBuilder
。对于空的默认构造函数,您根本不需要使用ModuleBuilder mb
方法;或者你可以使用DefineConstructor
。我已经包含了一个示例,其中显式调用了基本构造函数,但是,如果你想在其中添加一些额外的逻辑。
DefineDefaultConstructor