如何从公共类调用不同类中的同名静态方法?
静态类同名静态方法的跨类调用需求
我有两个包含同名静态方法的类:
class Class1 { public static void Main() { Core.DoSomethingElse("param"); } private static void DoSomething(string someParam) { Console.WriteLine("Hello from class 1"); } } class Class2 { public static void Main() { Core.DoSomethingElse("param"); } private static void DoSomething(string someParam) { Console.WriteLine("Hello from class 2"); } }
还有一个Core类,我希望从Core中调用上述类的DoSomething方法——因为Class1和Class2会调用Core的方法:
class Core { public static void DoSomethingElse(string someParam) { // 一些代码 /* 此处需根据调用DoSomethingElse的类, * 调用对应类自身的DoSomething方法 */ // 这里需要实现逻辑 Console.WriteLine("Hello from Core"); //更多代码 } }
期望效果
执行Class1时输出:
Hello from class 1 Hello from Core
执行Class2时输出:
Hello from class 2 Hello from Core
已尝试的方案(均失效)
- 使用接口:但Class1和Class2必须是静态类,无法实现接口
- 使用虚方法/抽象方法+继承:同样因方法必须为静态而无法生效
可行解决方案
由于静态类无法使用面向对象的多态特性(接口、继承),可以通过以下两种方式实现需求:
方案1:传递委托(推荐)
修改调用逻辑,让Class1/Class2将自身的DoSomething方法作为委托传递给Core,这样Core可以直接调用对应的方法。同时需要将DoSomething的访问修饰符改为internal(同程序集下可见)或者public:
修改后的Class1/Class2
class Class1 { public static void Main() { Core.DoSomethingElse("param", DoSomething); } internal static void DoSomething(string someParam) { Console.WriteLine("Hello from class 1"); } } class Class2 { public static void Main() { Core.DoSomethingElse("param", DoSomething); } internal static void DoSomething(string someParam) { Console.WriteLine("Hello from class 2"); } }
修改后的Core类
class Core { public static void DoSomethingElse(string someParam, Action<string> doSomethingAction) { // 一些代码 doSomethingAction(someParam); Console.WriteLine("Hello from Core"); //更多代码 } }
这种方式逻辑清晰,性能优于反射,是最推荐的实现方案。
方案2:使用反射获取调用方并调用方法
通过StackTrace获取调用方类型,再用反射调用对应的私有静态方法。这种方式不需要修改DoSomething的访问修饰符,但性能略低,且依赖调用栈信息,在开启代码优化的场景下可能失效:
修改后的Core类
using System.Diagnostics; using System.Reflection; class Core { public static void DoSomethingElse(string someParam) { // 一些代码 // 获取调用方类型 var stackTrace = new StackTrace(); var callingType = stackTrace.GetFrame(1)?.GetMethod()?.DeclaringType; if (callingType != null) { // 获取DoSomething私有静态方法并调用 var method = callingType.GetMethod("DoSomething", BindingFlags.NonPublic | BindingFlags.Static); method?.Invoke(null, new object[] { someParam }); } Console.WriteLine("Hello from Core"); //更多代码 } }
注意:如果项目开启了Release模式的代码内联优化,GetFrame(1)可能无法正确获取到调用方类型,需谨慎使用。
内容的提问来源于stack exchange,提问作者LuisAlfredo92
相关产品推荐
相关产品推荐

