2017-01-17 47 views
0
  • 我的代碼如下,其中WebServiceSender是父類。在子類中重載的父類上創建的調用擴展方法

  • 我已經添加擴展方法將其稱爲「ExtTest」。

  • 我有一個子類「ChildWebServiceSender」繼承 WebServiceSender。

  • 在我的孩子班級爲有兩個重載方法我有同樣的簽名 擴展方法的方法,public WebServiceSender ExtTest(string something)

現在創建子類的對象後,我獲得智能。但我總是可以從Child類調用ExtTest,但不能使用Extension方法。

如何調用擴展方法ExtTest?

public class WebServiceSender : IMessageSender 
{ 
    public void SendMessage(string subject, string body) 
    { 
     Console.WriteLine("Web Service\n{0}\n{1}\n", subject, body); 
    } 
} 
public static class util 
{ 
    public static WebServiceSender ExtTest(this WebServiceSender abc, string something) 
    { 
     Console.WriteLine("I am into extension"); 
     return new WebServiceSender(); 
    } 
} 

public class ChildWebServiceSender : WebServiceSender 
{ 
    public WebServiceSender ExtTest(string something) 
    { 
     Console.WriteLine("I am in instance"); 
     return new WebServiceSender(); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     ChildWebServiceSender d = new ChildWebServiceSender(); 
     d.ExtTest("abc"); 
    } 
} 
+0

這是不好的設計,只是要求麻煩。以適當的方式命名您的方法。 – CyberDude

回答

1

如果你想調用擴展方法,你應該投並把它從基類:

((WebServiceSender)d).ExtTest("abc"); 

而且你當然可以把它從你的擴展類明確:

util.ExtTest(d, "tra"); 

而且我同意評論和Jon Skeet。你需要這個實際上是一種代碼味道,並且使你的代碼不可讀。

+0

那工作。謝謝 –

+0

@GufranKhan如果這樣工作,你可以upvote答案並將其標記爲解決方案:) –

6

我如何可以調用擴展方法ExtTest?

實例方法總是比擴展方法更受歡迎 - 編譯器只在其他所有事情失敗後才檢查擴展方法。

在這種情況下,最簡單的方法就是使用WebServiceSender類型,而不是一個變量:

WebServiceSender d = new ChildWebServiceSender(); 
d.ExtTest("abc"); // This will call the extension method 

d執行時類型並不重要 - 只有編譯時類型。

如果您需要調用從ChildWebServiceSender方法以及,你可以使用兩個變量,指的是同一個對象:

ChildWebServiceSender child = new ChildWebServiceSender(); 
WebServiceSender baseRef = child; 
child.ExtTest("abc"); // This will call the child instance method 
baseRef.ExtTest("abc"); // This will call the extension method 

(您可以使用強制替代,當然 - 我想這將更清晰閱讀主要的一點是要作爲目標的方法調用WebServiceSender類型的表達式)

或者你可以只調用該方法作爲常規靜態方法:。

// TODO: Rename "util" to follow .NET naming conventions 
util.ExtTest(d, "abc"); 

或者,更好的,你可以讓他們不衝突重命名或者您的擴展方法或您的實例方法 - 這將使它更清晰,以人閱讀其中你想調用的代碼。

+0

但是,然後使用對象「d」,我不能從子類調用d.ExtTest(「abc」)。我應該可以從單個對象調用這兩種方法 –

+0

@GufranKhan:你應該說這就是你想要的。你只描述想要調用擴展方法...將編輯,但請嘗試在未來更清晰。 –

+0

對不起,在最後時刻添加了該問題。感謝雖然:) –

0

你必須調用它,彷彿它是一個常規的靜態方法,而不是調用它,就好像它是一個實例方法。當同時存在擴展方法和編譯器找到的同名實例方法時,實例方法總是「獲勝」。