[英]how to define List<Foo> as a property of Type by using AssemblyBuilder and TypeBuilder in dotnet Core 7?
我正在嘗試使用 do.net 7 Reflection.Emit 來創建 Dymamic Dll。
我想創建一個程序集,其中包含如下所示的字符串(或 Class 類型)屬性列表;
private List<string> Items;
// OR
private List<Foo> Items;
這是我用來向類型添加任何屬性的代碼。
AssemblyGeneratorHelper.AddProperty(dynamicType, "Items", typeof(List<string>));
這是我的助手方法。
public static void AddProperty(TypeBuilder typeBuilder, string propertyName, Type propertyType)
{
var fieldBuilder = typeBuilder.DefineField("_" + propertyName, propertyType, FieldAttributes.Private);
var propertyBuilder = typeBuilder.DefineProperty(propertyName, PropertyAttributes.HasDefault, propertyType, null);
var getMethod = typeBuilder.DefineMethod("get_" + propertyName,
MethodAttributes.Public |
MethodAttributes.SpecialName |
MethodAttributes.HideBySig, propertyType, Type.EmptyTypes);
var getMethodIL = getMethod.GetILGenerator();
getMethodIL.Emit(OpCodes.Ldarg_0);
getMethodIL.Emit(OpCodes.Ldfld, fieldBuilder);
getMethodIL.Emit(OpCodes.Ret);
var setMethod = typeBuilder.DefineMethod("set_" + propertyName,
MethodAttributes.Public |
MethodAttributes.SpecialName |
MethodAttributes.HideBySig,
null, new[] { propertyType });
var setMethodIL = setMethod.GetILGenerator();
Label modifyProperty = setMethodIL.DefineLabel();
Label exitSet = setMethodIL.DefineLabel();
setMethodIL.MarkLabel(modifyProperty);
setMethodIL.Emit(OpCodes.Ldarg_0);
setMethodIL.Emit(OpCodes.Ldarg_1);
setMethodIL.Emit(OpCodes.Stfld, fieldBuilder);
setMethodIL.Emit(OpCodes.Nop);
setMethodIL.MarkLabel(exitSet);
setMethodIL.Emit(OpCodes.Ret);
propertyBuilder.SetGetMethod(getMethod);
propertyBuilder.SetSetMethod(setMethod);
}
此代碼運行成功。 但是當我嘗試使用生成的程序集時,出現如下所示的錯誤。
實際上問題是我不知道如何將 List 屬性添加到復雜類型。 我認為還有另一種方法可以代替
AssemblyGeneratorHelper.AddProperty(dynamicType, "Items",typeof(List<string>));
這就是我解決問題的方法。 它按我的預期工作。
Type t1= typeof(Foo).MakeArrayType();
// OR
Type t2 = typeof(string).MakeArrayType();
AssemblyGeneratorHelper.AddProperty(dynamicType, "Items", t1);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.