You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从公共类调用不同类中的同名静态方法?

静态类同名静态方法的跨类调用需求

我有两个包含同名静态方法的类:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 23:31:01