如何通过静态类或其他方式更改密封类方法

本文关键字:密封 密封类 类方法 方式更 其他 何通过 静态类 | 更新日期: 2023-09-27 18:34:10

我想从静态类中覆盖密封类的方法。

例如:

public class MyClass
{
    public virtual void MyMethod()
    {
        Console.WriteLine("I'm MyMethod from MyClass");
    }
}
public sealed class MySealedClass : MyClass
{
    public override void MyMethod()
    {
        Console.WriteLine("I'm MyMethod from MySealedClass");
    }
}

MyClass 有一个名为 MyMethod 的虚拟方法。

在密封类中,此方法已被 self 覆盖,我想通过这个静态类再次为另一个作业编写它:

public static class ClassManager
{
    public static void MyMethod(this MySealedClass msc)
    {
        Console.WriteLine("I'm MyMethod from ClassManager");
    }
}

现在,我们调用该静态方法从 Program 类来运行它:

class Program
{
    static void Main(string[] args)
    {
        new MySealedClass().MyMethod();
    }
}

但是这个结果称为MySealedClass方法,而不是我的静态类方法!

我是来自MySealedClass的MyMethod

请帮助我,如何通过静态类或其他方式更改密封类方法?

如何通过静态类或其他方式更改密封类方法

你不能

那样做。仅当类型中没有具有该签名的方法时,才会考虑扩展方法。

您需要显式调用 static 方法:

ClassManager.MyMethod(new MySealedClass());

这是不可能的。从 MSDN:

永远不会调用与接口或类方法具有相同名称和签名的扩展方法。在编译时,扩展方法的优先级始终低于类型本身中定义的实例方法。换句话说,如果类型具有名为 Process(int i( 的方法,并且您具有具有相同签名的扩展方法,则编译器将始终绑定到实例方法。

从 C# 规范:

上述规则(规范中指定的规则集(意味着实例方法优先于扩展方法,内部命名空间声明中可用的扩展方法优先于外部命名空间声明中可用的扩展方法

,并且直接在命名空间中声明的扩展方法优先于使用 using namespace 指令导入到同一命名空间中的扩展方法。

您必须通过静态类调用该方法,而不是作为扩展方法调用该方法。