2012-11-23 51 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