考虑这个简单的代码:
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");
}
}
当调用测试方法时,它将执行带有基本参数的Validate方法,而不是调用d.Validate()
。
如何强制测试方法调用正确的Validate方法,而不在其中进行类型测试?
答案 0 :(得分:0)
您需要一个不受支持的虚拟扩展方法。扩展方法只是在编译时绑定的静态方法调用的语法糖。您必须通过查看运行时类型来添加一些动态调度,以查看应该调用哪个扩展方法。
在您的情况下,为什么不将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");
}
}