您能否详细说明您遇到的问题(也许显示代码是一个不适合您的代码的小示例)?因为TypeBuilder
派生自Type
,如果您尝试定义相互递归的类型,您可以将两个TypeBuilder
s 传递到您想要引用类型的任何地方。
编辑
无需“解析”类型。您可以访问TypeBuilder
每个 s 并且可以使用它们,就像它们是完全定义的类型一样。这是一个生成您在更新中请求的代码的示例:
private void DefineAutoProp(string name, Type t, TypeBuilder tb)
{
var fldName = name.Substring(0, 1).ToLower() + name.Substring(1);
var fld = tb.DefineField(fldName, t, FieldAttributes.Private);
var prop = tb.DefineProperty(name, PropertyAttributes.None, t, null);
var getter = tb.DefineMethod("get_" + name, MethodAttributes.Public, t, null);
var ilg = getter.GetILGenerator();
ilg.Emit(OpCodes.Ldarg_0);
ilg.Emit(OpCodes.Ldfld, fld);
ilg.Emit(OpCodes.Ret);
var setter = tb.DefineMethod("set_" + name, MethodAttributes.Public, typeof(void), new[] { t });
ilg = setter.GetILGenerator();
ilg.Emit(OpCodes.Ldarg_0);
ilg.Emit(OpCodes.Ldarg_1);
ilg.Emit(OpCodes.Stfld, fld);
ilg.Emit(OpCodes.Ret);
prop.SetGetMethod(getter);
prop.SetSetMethod(setter);
}
public void DefineTypes()
{
var ab = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("test"), AssemblyBuilderAccess.Run);
var mb = ab.DefineDynamicModule("test");
var A = mb.DefineType("A", TypeAttributes.Public | TypeAttributes.Class);
var B = mb.DefineType("B", TypeAttributes.Public | TypeAttributes.Class);
DefineAutoProp("AnInstanceOfA", A, B);
DefineAutoProp("AnInstanceOfB", B, A);
A.CreateType();
B.CreateType();
}