您可以創建父類,而無需在不同的程序集中創建子類,事實上您的代碼幾乎是正確的。在你的代碼,你有相符的一個錯誤:
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!由於您是新手,您可能需要查看此鏈接。 –