有没有办法在C#中重载扩展方法?

时间:2009-05-24 02:58:05

标签: c# extension-methods

我有以下模型模式:

public abstract class PARENTCLASS {...}
public class CHILD_A_CLASS : PARENTCLASS{...}
public static class EXTENSION{
  public static METHOD(this PARENTCLASS parent){...}
  public static METHOD(this CHILD_A_CLASS child) {...}
}

如上所述,当然会有更多的孩子(和孙子)课程,但我只是把其中一个。问题是,当我调用扩展方法时,如下所示:

PARENTCLASS cc = new CHILD_A_CLASS();
cc.METHOD();

它将执行PARENT扩展方法而不是我期望的CHILD扩展方法。有人知道如何实现这个? (我不是在考虑将METHOD本身放入类中并让它继承它,因为我希望保持模型类的清洁并远离其他逻辑。)

2 个答案:

答案 0 :(得分:5)

重载扩展方法当然是可能的。您的代码是一个确切如何操作的示例。

你看起来想要的是能够覆盖扩展方法,使得对象的运行时类型将决定扩展方法调用。就像在类上定义虚方法一样。此功能没有特定的语言语法支持。

如果这对您来说非常重要,可以手动实现该功能。它需要一点蛮力,但它会完成工作。例如......

public static class Extension {
  public static void Method(this ParentClass p) { 
    var c = p as ChildAClass;
    if ( c != null ) {
      Method(c);
    } else {
      // Do parentclass action
    }
  }
  public static void Method(this ChildAClass c) {
    ...
  }
}

答案 1 :(得分:1)

不幸的是,我不认为你能在这里得到你想要的东西。扩展方法是静态的,静态方法不能是虚拟的。

你可以用JaredPar的解决方案解决这个问题。

如果您的目标是将模型与某些实现分开,我建议您查看 Bridge Pattern (GOF)。 “将抽象与实现分开”这可能有助于区分您的疑虑并使您的模型类更清晰。