2012-11-23 50 views
17

可能重复:
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."); 
    } 
} 

现在,如果我叫治法像

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

它将始终调用原始方法。我怎样才能调用扩展方法。

+0

此外的轻微变化http://stackoverflow.com/questions/2303885/if-an-extension-method-has-the-same-signature-as-a-method-in-the-sealed- class-w?rq = 1 – 2012-11-23 07:25:47

回答

26

您不能将扩展方法作为普通扩展方法调用。实例方法覆盖具有相同签名的扩展方法

编辑:

你可以把它作为一个静态方法

ExtensionTest.MethodA(a); 
+2

,这不会解决我的问题。但谢谢你的回答.. –

+1

不客气。这个想法是,如果你想使用扩展方法作为真正的扩展方法,如果你有一个具有相同签名的实例方法,则不能使用它,因为该实例方法总是优先于扩展方法:) – Mihai

+1

+ 1作为第一个正确的答案,惊讶地看到它得到downvote – Habib

2

可以调用扩展方法与任何其他静态方法:

ExtenstionTest.MethodA(a); 
6

Extension Methods - MSDN

相同名称和签名的扩展方法作为 接口或类方法将永远不会被称为。在编译时, 扩展方法总是比类型本身定义的实例方法具有更低的优先级

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

ExtenstionTest.MethodA(a); 

MSDN

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

14

不能称之为作为扩展方法。就延长方法而言,这一点基本上是无用的。 (我个人希望这是一个警告,但没关系。)

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

在的一种形式的一个方法调用[...]如果正常处理F中的调用没有发现适用的方法,试图以处理构造为扩展方法调用。

及更高版本:

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

你可以这样调用它虽然是普通的静态方法:

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

其他人建议您不能调用此方法。调用它的唯一方式是这样的:

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

如果其他人已经提出了它,发布相同的答案,没有带来什么新的东西有什么意义? – Mihai

+3

+1。上面的新东西是“唯一的方式”:) –

+3

是的。但其他人已经说过了 – Mihai