您可以创建父类,而无需在不同的程序集中创建子类,事实上您的代码几乎是正确的。在你的代码,你有相符的一个错误:
parentBuilder.DefineProperty("MyProperty", PropertyAttributes.None, childBuilder.CreateType(), null);
在这里,您试图嵌套类型,它是在这一刻不必要的CreateType
。你可以只是一个TypeBuilder
为它提供:
parentBuilder.DefineProperty("MyProperty", PropertyAttributes.None, childBuilder, null);
但请记住,这定义在这种方式财产不足以。你必须为它的setter和getter提供一个实现(可能还有一个后台字段)。这里有一个工作示例的代班:
public class Parent
{
public class Child
{
}
private Parent.Child myChild;
public Parent.Child MyChild
{
get
{
return this.myChild;
}
set
{
this.myChild = value;
}
}
}
代码:
TypeBuilder parentBuilder = moduleBuilder.DefineType("Parent", TypeAttributes.Public);
TypeBuilder childBuilder = parentBuilder.DefineNestedType("Child", TypeAttributes.NestedPublic);
PropertyBuilder propertyBuilder = parentBuilder.DefineProperty("MyChild", PropertyAttributes.None, childBuilder, null);
// Define field
FieldBuilder fieldBuilder = parentBuilder.DefineField("myChild", childBuilder, FieldAttributes.Private);
// Define "getter" for MyChild property
MethodBuilder getterBuilder = parentBuilder.DefineMethod("get_MyChild",
MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig,
childBuilder,
Type.EmptyTypes);
ILGenerator getterIL = getterBuilder.GetILGenerator();
getterIL.Emit(OpCodes.Ldarg_0);
getterIL.Emit(OpCodes.Ldfld, fieldBuilder);
getterIL.Emit(OpCodes.Ret);
// Define "setter" for MyChild property
MethodBuilder setterBuilder = parentBuilder.DefineMethod("set_MyChild",
MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig,
null,
new Type[] { childBuilder });
ILGenerator setterIL = setterBuilder.GetILGenerator();
setterIL.Emit(OpCodes.Ldarg_0);
setterIL.Emit(OpCodes.Ldarg_1);
setterIL.Emit(OpCodes.Stfld, fieldBuilder);
setterIL.Emit(OpCodes.Ret);
propertyBuilder.SetGetMethod(getterBuilder);
propertyBuilder.SetSetMethod(setterBuilder);
感谢您的快速答复。我没有意识到我可以通过TypeBuilder作为返回类型。 –
欢迎来到SO!由于您是新手,您可能需要查看此链接。 –