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

.net 在将自身指定为泛型类型参数时,是否可以发出从泛型类型派生的类型?,.net,generics,reflection.emit,.net,Generics,Reflection.emit,设想以下完全合法的类型层次结构: class A<T> where T : A<T> { } class B : A<B> { public B():base(){} } A类,其中T:A { } B类:A { 公共B():基(){} } 我的问题是给出了a的静态编译定义,是否可以动态地发出类型B 问题是如何在ModuleBuilder.DefineType中指定父类型 或者也许有另一种方法来制作这种类型,除了 使用上述方法 使用CodeDom(非

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

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

class B : A<B>
{
  public B():base(){}
}
A类,其中T:A
{
}
B类:A
{
公共B():基(){}
}
我的问题是给出了a的静态编译定义,是否可以动态地发出类型B

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

或者也许有另一种方法来制作这种类型,除了

  • 使用上述方法
  • 使用CodeDom(非常类似于创建一个临时文件并将其传递给csc.exe:-)
编辑:
类型
B
应该有显式的公共默认构造函数,调用从
A

继承的默认构造函数。您可以使用未指定父类型的
ModuleBuilder.DefineType
重载,然后使用
TypeBuilder.SetParent
方法将父类设置为递归类型(使用类似于
typeof(A).MakeGenericType(tb)
的参数,其中
tb
是您的
TypeBuilder
,但我面前没有C编译器)

EDIT-这里有一个工作示例,假设您有一个
ModuleBuilder mb
。对于空的默认构造函数,您根本不需要使用
DefineConstructor
方法;或者您可以使用
DefineDefaultConstructor
。我包含了一个示例,其中基本构造函数是显式不过,如果您想在其中添加一些额外的逻辑,请单击此处

TypeBuilder tb = mb.DefineType("B");
Type AB = typeof(A<>).MakeGenericType(tb);
tb.SetParent(AB);
ConstructorInfo ctor = TypeBuilder.GetConstructor(AB, typeof(A<>).GetConstructor(new Type[] { }));
ILGenerator ilg = tb.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, new Type[] { }).GetILGenerator();
ilg.Emit(OpCodes.Ldarg_0);
ilg.Emit(OpCodes.Call, ctor);
ilg.Emit(OpCodes.Ret);
Type t = tb.CreateType();
TypeBuilder tb=mb.DefineType(“B”);
AB型=A型。MakeGenericType(tb);
tb.SetParent(AB);
ConstructorInfo-ctor=TypeBuilder.GetConstructor(AB,typeof(A).GetConstructor(新类型[]{}));
ILGenerator ilg=tb.DefineConstructor(MethodAttributes.Public,CallingConventions.Standard,新类型[]{}).GetILGenerator();
ilg.Emit(操作码.Ldarg_0);
ilg.Emit(操作码.Call,ctor);
ilg.Emit(操作码Ret);
类型t=tb.CreateType();

仍然存在问题。请尝试生成默认构造函数,它当然应该调用基类型的默认构造函数。DefineConstructor返回用于发出构造函数代码的ConstructorBuilder。其中一个代码语句应该调用基类型的构造函数smth,如下所示-ilg.emit(OpCodes.Call,ctor);其中,ctor是与基类型的构造函数相对应的基类型ConstructorInfo实例。问题是如何获取ctor?我失败了。使用
SetParent
设置泛型父类型后,请尝试
tb.BaseType.GetConstructor()
获取基类型的构造函数。您尝试过吗?因为我尝试过,但失败了。请继续,自己看看。默认构造函数将在默认情况下创建(您无需执行任何操作)。显式调用DefinedDefaultConstructor也适用于我……请看一下。我想您也有同样的问题。