gpt4 book ai didi

c# - 如何调用(非虚拟)虚拟方法的原始实现?

转载 作者:太空狗 更新时间:2023-10-29 19:56:27 24 4
gpt4 key购买 nike

我有以下情况:

在第 3 方库中(无法修改):

class A { public virtual void M() {} }

class B : A { public override void M() {} }

在我自己的代码中:

class C : B { public override void M() {} }

C 的方法 M 的实现我想调用 A 的(但不是 B的!!)。可以吗?

接受任何技巧,包括反射(reflection)。我已经尝试过反射,但是使用从 typeof(A) 获得的 MethodInfo 仍然会生成一个虚拟调用(调用 C 的实现随后的堆栈溢出)。

由于重新实现 B 的复杂性,从 A 派生 C 是不可能的。

最佳答案

您可以生成动态方法来创建使用 Call(而非 CallVirt)指令的代理

        var x = new C();
var m = typeof (A).GetMethod("M");
var dm = new DynamicMethod("proxy", typeof (void), new [] {typeof(C)}, typeof (C));
var il = dm.GetILGenerator();
il.Emit(OpCodes.Ldarg_0);
il.Emit(OpCodes.Call, m);
il.Emit(OpCodes.Ret);
var action = (Action<C>)dm.CreateDelegate(typeof (Action<C>));
action(x);

关于c# - 如何调用(非虚拟)虚拟方法的原始实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3378010/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com