C# 如何在运行时更改静态方法的行为?

C# 如何在运行时更改静态方法的行为?,c#,reflection,C#,Reflection,有没有办法在运行时修改静态方法的行为 例如: 假设我有这门课 public class Utility { public static void DoSomething(string data){ //... } } 有没有办法做到这一点: typeof(Utility).SetMethod("DoSomething", (data) => { /*Do something else...*/ }); 这样,如果您调用实用程序.DoSomething它

有没有办法在运行时修改静态方法的行为

例如:

假设我有这门课

public class Utility {

    public static void DoSomething(string data){
        //...
    }
}
有没有办法做到这一点:

typeof(Utility).SetMethod("DoSomething", (data) => { /*Do something else...*/ });
这样,如果您调用
实用程序.DoSomething
它将执行新代码?

当然

public class Utility {

    public static Action<String> _DoSomething;

    public static void DoSomething(string data){
        if (_DoSomething != null) {
            _DoSomething();
            return;
        }

        // default behavior here.
    }
}

您要做的是将所需的行为作为另一个参数传递到函数中

public static void DoSomething(string data, Action<string> operation)
{
    operation(data);
}
publicstaticvoiddosomething(字符串数据、动作操作)
{
操作(数据);
}
当然,这是一个过于简单的例子。您在自己的代码中实际执行的操作将取决于
操作实际执行的操作



如果您试图修改现有的、已编译的、生产中的方法的行为,并且不能以通常的方式重载或重写该方法,那么我所知道的唯一方法就是CIL重写,可能使用。

我不明白为什么您不创建一个从实用程序继承的新类,并定义一个做您想要的事情的新函数

public class Program
{
    static void Main(string[] args)
    {
        if (true)
        {
            Utility.DoSomething("TEST");
        } else
        {
            Util1.DoSomething("TEST");
        }
    }
}

public class Utility
{
    public static void DoSomething(string data)
    {
        //Perform some action
    }
}

abstract class Util1 : Utility
{
    public static new void DoSomething(string data)
    {
        //Perform a different action
    }
}
我认为,尽管有可能做到这一点,但你应该问问自己:“为什么我需要这个功能?”?通常一个方法保持原样,并根据其接口执行它应该执行的操作,该接口由其名称和签名给出。因此,当您可以通过在签名中添加一个
操作
-参数来添加额外的逻辑时,您应该问问自己,这是否会破坏接口的契约,从而该方法的设计目的是什么

这样说,如果你需要的功能是某种“与父类做不同的事情”,或者通过在你的消费类中添加一个依赖项并向该类添加一些方法来扩展包含该类的功能(也见)

,那么你应该考虑改写方法。
编辑:当您使用静态方法时,覆盖的机会已经过时。然而,IMO听起来是一个很大的设计缺陷。

您可以将lambda存储在变量中,并且可以使用
dosmething
调用变量?然后,您可以随时更改该变量以存储新的lambda。但我不是C#dev…我提供了一个答案,因为它非常简单。但是,我相信这个问题属于这样。使用非静态方法可能是一个更好的主意。这不是一个痛苦的问题,但这个问题不是有点离题,因为它几乎是一个如何编码的要求吗?@Quezocotl:这是一个“代码就是设计”的问题。我们想在这里(积极地)结束的问题是“修复我的坏代码”问题。无论如何,你不需要一个成员变量来完成这项工作,除非你正在设置某种“订户”场景。@RobertHarvey不能100%确定你的意思。但是,当调用
\u DoSomething=null
时,成员变量+方法组合可以避免中断。。。好。。。除非它在那个箱子里应该破裂!但是,如果这是解决方案,为什么不直接调用
operation
?这是一个人为的例子。对于这个特定的场景,这正是我要做的。但是OP说他想改变这种方法的行为。@RobertHarvey-我有点假设他不能改变剂量测定法。否则,他就不会问这个问题了。我只需要创建一个从实用程序继承的新类。我不喜欢将代码注入到静态方法中的想法。而且,既然OP要求我们调试代码,那么这个问题不是离题了吗?这不应该是这样的吗?
public class Program
{
    static void Main(string[] args)
    {
        if (true)
        {
            Utility.DoSomething("TEST");
        } else
        {
            Util1.DoSomething("TEST");
        }
    }
}

public class Utility
{
    public static void DoSomething(string data)
    {
        //Perform some action
    }
}

abstract class Util1 : Utility
{
    public static new void DoSomething(string data)
    {
        //Perform a different action
    }
}
class MyClass {
    Utility MyUtility;

    void ExtraMethod() { /* ... */ }
}