亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

System.Reflection.Emit:將類和接口綁定在一起

System.Reflection.Emit:將類和接口綁定在一起

C#
波斯汪 2023-08-13 13:51:18
A我想將一個類和一個接口綁定在一起B,并創建一個實現該接口C的類型。還:CBtypeC有一個構造函數,它接受 type 的對象A作為構造函數,我們稱之為iA給定從到的所有屬性的映射B(假設映射中的所有屬性具有相同的類型),則它使用來自 的屬性值i。例如:class A { public string Name { get; set; } } interface B { string Name { get; set; } } class C : B {    private readonly A _i;    public C(A i) {         _i = i;    }    public string Name    {        get => _i.Name;        set => _i.Name = value;    }} 這就是我所做的(我的意思是“常見” B,我的意思是“來源” A):/// <summary>/// Creates a new type dynamically/// </summary>public class CustomTypeGenerator<TSource, TCommon>{    private readonly TypeBuilder _tb;    private readonly FieldBuilder _entityFieldBldr;    private readonly Type _srcType;    /// <summary>    /// Initialize custom type builder    /// </summary>    public CustomTypeGenerator(IEnumerable<(string CommonPrpName, Type Type, string SourcePrpName)> members)    {        var cmType = typeof(TCommon);        _srcType = typeof(TSource);        if (!cmType.IsInterface)        {            throw new Exception("Type has to be an interface");        }        const string assemblyName = "DynamicAseembly123";        const string typeSignature = "DynamicType123";        var assemblyBuilder =            AssemblyBuilder.DefineDynamicAssembly(new AssemblyName(assemblyName), AssemblyBuilderAccess.Run);        var moduleBuilder = assemblyBuilder.DefineDynamicModule("Module123");        foreach (var (commonPrpName, type, sourcePrpName) in members)        {            EmitProperty(commonPrpName, type, sourcePrpName);        }        EmittedType = _tb.CreateType();    }}我得到的異常:程序集“DynamicAseeembly123,Version=0.0.0.0,Culture=neutral,PublicKeyToken=null”的類型“DynamicType123”中的方法“get_Name”沒有實現。感謝您的任何幫助或提示。
查看完整描述

1 回答

?
素胚勾勒不出你

TA貢獻1827條經驗 獲得超9個贊

最初的問題是因為 getter/setter 方法需要MethodAttributes.Virtual能夠隱式實現相應的接口方法。

添加該標志足以實現所需的隱式接口實現。實際上,您也可以使用DefineMethodOverride隱式實現 - 它不會造成傷害,但不是必需的。

上述內容已在您更新的代碼中修復。但現在它生成了InvalidProgramException.?這是由于(我猜是復制/粘貼)在set方法主體生成中使用get?IL 生成器變量引起的:

setIl.MarkLabel(modifyPropertyLbl);

setIl.Emit(OpCodes.Ldarg_0);

getIl.Emit(OpCodes.Ldfld, _entityFieldBldr); // <--

setIl.Emit(OpCodes.Ldarg_1);

getIl.Emit(OpCodes.Callvirt, setterMethodInfo); // <--

setIl.Emit(OpCodes.Nop);

setIl.MarkLabel(exitSetLbl);

setIl.Emit(OpCodes.Ret);

這當然會為 getter 和 setter 發出無效代碼。使用正確的變量,一切都會好起來的?;旧?/p>


var setIl = setPropMthdBldr.GetILGenerator();

setIl.Emit(OpCodes.Ldarg_0);

setIl.Emit(OpCodes.Ldfld, _entityFieldBldr);

setIl.Emit(OpCodes.Ldarg_1);

setIl.Emit(OpCodes.Callvirt, setterMethodInfo);

setIl.Emit(OpCodes.Ret);


查看完整回答
反對 回復 2023-08-13
  • 1 回答
  • 0 關注
  • 142 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號