如何调用与现有方法同名的扩展方法?

可能重复:
在C#中是否有任何方法可以使用扩展方法覆盖类方法?

我的代码就像

public class TestA { public string ColA { get; set; } public string ColB { get; set; } public string ColC { get; set; } public void MethodA() { MessageBox.Show("Original A1."); } } static class ExtenstionTest { public static void MethodA(this TestA A1) { MessageBox.Show("Extended A1."); } } 

现在,如果我将MethodA称为

 TestA a = new TestA(); a.MethodA(); 

它总是会调用Original方法。 如何调用扩展方法。

您不能将扩展方法称为常规扩展方法。 实例方法使用相同的签名覆盖扩展方法

编辑:

您可以将其称为静态方法

 ExtensionTest.MethodA(a); 

您不能将其称为扩展方法 。 就扩展方法而言,此时基本上没用。 (我个人认为这是一个警告,但没关系。)

编译器在尝试解析扩展方法之前尝试所有可能的实例方法。 从C#4规范的7.6.5.2节:

在其中一种forms的方法调用中,如果调用的正常处理找不到适用的方法,则尝试将该构造作为扩展方法调用进行处理。

然后:

前面的规则意味着实例方法优先于扩展方法

您可以像常规静态方法一样调用它:

 // Fixed typo in name ExtensionTest.MethodA(a); 

扩展方法 – MSDN

永远不会调用与接口或类方法具有相同名称和签名的扩展方法。 在编译时, 扩展方法的优先级始终低于类型本身中定义的实例方法。

您可以将扩展方法称为类的常规静态方法。

 ExtenstionTest.MethodA(a); 

来自MSDN

换句话说,如果类型具有名为Process(int i)的方法,并且您具有具有相同签名的扩展方法,则编译器将始终绑定到实例方法。 当编译器遇到方法调用时,它首先在类型的实例方法中查找匹配项。 如果未找到匹配项,它将搜索为该类型定义的任何扩展方法,并绑定到它找到的第一个扩展方法。 以下示例演示了编译器如何确定要绑定的扩展方法或实例方法。

您可以像任何其他静态方法一样调用扩展方法:

 ExtenstionTest.MethodA(a); 

正如其他人建议你不能称这种方法。调用它的唯一方法是:

 TestA a = new TestA(); ExtenstionTest.MethodA(a);