当前位置: 首页 > 编程语言 > C#

如何调用一个(非虚)虚方法的原始实现?分享

时间:2023-04-11 11:11:05 C#

如何调用一个(非虚)虚方法的原实现?我有以下情况:在第3方库中(无法修改):classA{publicvirtualvoidM(){}}classB:A{publicoverridevoidM(){}}在我自己的代码中:classC:B{publicoverridevoidM(){}}从C对方法M的实现,我想调用A(但不是B的!!)。我可以吗?欢迎使用任何技术,包括反思。我试过反射,但使用从typeof(A)获得的MethodInfo仍然会生成一个虚拟调用(调用C的实现,随后的堆栈溢出)。由于重新实现B的复杂性,从A派生C是不可能的。您可以生成动态方法来制作使用Call(而不是CallVirt)指令的代理varx=newC();varm=typeof(A).GetMethod("M");vardm=newDynamicMethod("proxy",typeof(void),new[]{typeof(C)},typeof(C));varil=dm.GetILGenerator();il.Emit(OpCodes.Ldarg_0);il.Emit(OpCodes.Call,m);il.Emit(OpCodes.Ret);varaction=(Action)dm.CreateDelegate(typeof(Action));动作(x);我担心这不可能直接按照您描述的方式进行——虚拟方法的目的是使重写变得透明。因此,实现这一目标的唯一方法是通过变通办法。让我试一试,但请注意,这是一个老掉牙的建议。如果你真的需要在你的代码中使用这个结构,这可能表明你的代码在其他地方有一个基本的设计缺陷,所以重构一些东西可能比填补另一个设计缺陷更令人满意。但无论如何,这里...classA{publicvirtualvoidM(){m_protected();}protectedvoidm_protected(){/*代码在这里*/}}classB{publicoverridevoidM(){/*代码在这里,可能调用base.M()*/}}classC{publicoverridevoidM(){m_protected();在我之前的回答中,我错过了A和B在外部库中并且无法修改的事实。在这种情况下,我建议采用不同的方法。基本上,如果设计缺陷在B中,则不能在A中使用B.子类。当然,这样做的不幸后果是您可能需要重新实现B中的部分或全部功能。您可以从中复制代码必要时使用反光板。我意识到这听起来不合适,但我仍然认为最好使用具有已知问题的不可修改代码。你不能那样做。您可能应该以不同的方式设计您的类层次结构,因为自Binheritance以来C看起来很奇怪,同时表现得像A。无论如何,它可能对您的情况有意义。然后你应该在A中创建另一个你不会覆盖的方法:}}classC{publicoverridevoidM(){basicM();顺便说一句,如果你像我在例子中那样命名方法,那么你应该重新考虑整个事情。如果这个层次结构是合理的,basicM可能会实现一些应该是具有不同名称的单独方法的东西,甚至可能是公共方法。以上是C#学习教程:如何调用(非虚)虚方法的原实现?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: