继承和扩展方法

Som*_* me 5 c# inheritance extension-methods

考虑这个简单的代码:

public void Main()
{
    var d = new Derived();

    test(d);
}

public void test(Base parameter)
{
    parameter.Validate();
}

public class Base
{
}
public class Derived : Base
{
}

public static class Validation
{
    public static void Validate(this Base b)
    {
        Console.WriteLine("Validation for base");
    }
    public static void Validate(this Derived d)
    {
        Console.WriteLine("Validation for Derived");
    }
}
Run Code Online (Sandbox Code Playgroud)

当测试方法被调用时,它将执行 Validate 方法,该方法采用基本参数,而不是像我调用d.Validate().

如何强制测试方法调用正确的 Validate 方法,而不在其中进行类型测试?

D S*_*ley 3

您需要一个不受支持的虚拟扩展方法。扩展方法只是在编译时绑定的静态方法调用的语法糖。您必须通过查看运行时类型来添加一些动态调度,以了解应调用哪个扩展方法。

在你的例子中,为什么不直接创建Validate基类的虚拟方法呢?

public class Base
{
    public virtual void Validate()
    {
        Console.WriteLine("Validation for base");
    }
}
public class Derived : Base
{
    public override void Validate()
    {
        base.Validate();  // optional
        Console.WriteLine("Validation for Derived");
    }
}
Run Code Online (Sandbox Code Playgroud)