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 发出无效代码。使用正确的变量,一切都会好起来的。基本上
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 关注
- 108 浏览
添加回答
举报