C# 如何在实现类中引用接口的默认方法实现规避StackOverflowException
可行解决方案
首先明确:C# 目前没有原生的类似base.TestMethod()的语法直接调用接口的默认实现,这是因为C#支持多接口实现,同名默认方法存在歧义风险,语言层面没有提供这种直接调用语法。下面给出2种不改动接口方法名、不影响其他实现类的方案:
方案1:接口内抽离公共静态实现(推荐,无性能损耗)
你可以将接口默认方法的逻辑封装为接口内部的静态方法,原有默认实现和需要调用默认逻辑的实现类都复用这个静态方法即可,不会对其他已经实现接口的类产生任何影响:
public interface TestInterface { // 抽离的公共静态实现,仅内部或显式调用 protected static int DefaultTestMethod() { return 15; } // 原有默认实现保持不变,其他实现类不受影响 public int TestMethod() { return DefaultTestMethod(); } } public class TestClass : TestInterface { public int TestMethod() { // 直接调用接口的静态默认实现,不会触发递归 return 1 + TestInterface.DefaultTestMethod(); } }
方案2:反射调用接口默认实现(无需修改原有接口定义)
如果你完全不能改动原有接口的代码,可以通过反射找到接口的默认方法实现,传入当前实例调用:
public class TestClass : TestInterface { public int TestMethod() { // 反射获取接口的默认方法 var interfaceMethod = typeof(TestInterface).GetMethod(nameof(TestMethod))!; // 调用默认方法,传入当前实例作为this参数 var defaultResult = (int)interfaceMethod.Invoke(this, null)!; return 1 + defaultResult; } }
这个方案不需要修改接口任何代码,完全不影响其他实现类,唯一缺点是有轻微的反射性能开销,如果调用频率很高可以考虑缓存MethodInfo实例优化性能。
内容的提问来源于stack exchange,提问作者Tester Bill
相关产品推荐
相关产品推荐

