Вы можете использовать перегрузку ModuleBuilder.DefineType
, которая не указывает родительский тип, а затем использовать метод TypeBuilder.SetParent
, чтобы установить родительский тип для рекурсивного типа (используя аргумент, например, typeof(A<>).MakeGenericType(tb)
, где tb
ваш TypeBuilder
, но у меня нет компилятора C # передо мной).
РЕДАКТИРОВАТЬ - вот рабочий пример, если у вас есть 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();