簡體   English   中英

如何定義列表<foo>在 do.net Core 7 中使用 AssemblyBuilder 和 TypeBuilder 作為 Type 的屬性?</foo>

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM