【发布时间】:2015-06-26 15:08:00
【问题描述】:
考虑这个简单的代码:
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 方法,而不在其中进行类型测试?
【问题讨论】:
-
你不能通过使用扩展方法。扩展方法在编译时解析,而您希望在运行时进行检查。
-
扩展方法不是多态的。由于
parameter是Base,因此即使传递的对象实际上是Derived,也会调用扩展Base的方法。您可以通过提供采用Derived的test()重载来解决此问题,但如果您有许多派生类,此解决方案无法很好地扩展。 -
((Derived)parameter).Validate();,但您应该寻找另一种剥猫皮的方法。这使得维护成为一场噩梦。 -
@xanatos 好的,但即使使用常规的静态方法,我也会得到相同的结果。看来我得另选路了
-
@BradChristie 好点,这场噩梦正是我想要避免的事情之一。
标签: c# inheritance extension-methods