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

时间:2014-12-13 10:15:53

标签: c# static override sealed

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

例如:

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

  

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

2 个答案:

答案 0 :(得分:4)

您不能这样做。只有在您的类型中没有带有该签名的方法时,才会考虑扩展方法。

您需要明确调用static方法:

ClassManager.MyMethod(new MySealedClass());

答案 1 :(得分:3)

这是不可能的。来自MSDN

  

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

来自C#规范:

  

前面的规则(规范中指定的规则集)意味着实例方法优先于扩展方法,内部命名空间声明中可用的扩展方法优先于外部命名空间中可用的扩展方法声明,以及直接在命名空间中声明的扩展方法优先于使用using namespace指令导入同一命名空间的扩展方法。

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