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

我有以下模型模式:

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本身放入类中并让它inheritance,因为我希望保持模型类清洁并远离其他逻辑)。

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

您似乎想要的是能够以这样的方式覆盖扩展方法,即对象的运行时类型将确定扩展方法调用。 就像在类上定义虚方法一样。 此function没有特定的语言语法支持。

如果这对您来说非常重要,那么可以手动实现该function。 它需要一点暴力,但它会完成工作。 例如 …

 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) { ... } } 

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

您可以使用JaredPar的解决方案来解决这个问题。

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