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);
- 1 回答
- 0 關注
- 142 瀏覽
添加回答
舉報