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

时间:2012-11-23 06:55:29

标签: c# extension-methods

  

可能重复:
  Is there any way in C# to override a class method with an extension method?

我有像

这样的代码
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方法。如何调用扩展方法。

5 个答案:

答案 0 :(得分:34)

您不能将扩展方法称为普通扩展方法。实例方法使用相同的签名

覆盖扩展方法

编辑:

您可以将其称为静态方法

ExtensionTest.MethodA(a);

答案 1 :(得分:17)

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

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

  

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

以后:

  

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

您可以将它称为常规静态方法:

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

答案 2 :(得分:8)

Extension Methods - MSDN

  

使用相同名称和签名的扩展方法   界面或类方法永远不会被称为。在编译时,   扩展方法的优先级始终低于类型本身定义的实例方法

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

ExtenstionTest.MethodA(a);

来自MSDN

  

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

答案 3 :(得分:3)

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

ExtenstionTest.MethodA(a);

答案 4 :(得分:0)

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

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