2011-09-15 65 views
1

在前一個組織中,我們實現了一個爲String.Format創建簡寫的擴展方法。該方法被稱爲「String.F」。不過,我似乎無法得到這個工作。一位前同事給了我下面的代碼,以及我自己的測試方法。在函數'Test()'中,「String.F」會引發錯誤,並且不會在intellisence中顯示。我會問,如果這是不可能的,但我已經編寫了使用此方法調用的代碼。這隻有在使用實例化的字符串時纔可以使用?謝謝。使用非實例化對象的擴展方法,即String.F()

public static class MyExtensions { 
    public static string F(this string target, params object[] args) { 
     return "hello"; 
    } 
} 

class TestExtensions { 
    public string Test() { 
     return String.F("test:{0}", "test"); 
    } 
} 
+0

這應該_not甚至compile_。 –

回答

6

你不能做擴展方法並在靜態上下文中使用它。擴展方法只能用作實例方法。

你可以做

public static string F(this string target, params object[] args) { 
     return String.Format(target, args); 
} 

,並使用它像這樣

"test:{0}".F("test"); 
+0

首先,擴展方法*是*靜態方法。它們甚至可以在空對象上調用。有問題的方法也可以這樣調用:MyExtensions.F(test:{0},「test」) – codymanix

+0

@codymanix擴展方法是靜態的,可以像您提到的那樣作爲靜態方法調用,而不是關於它的問題。但是,如果你打算以這種方式調用擴展方法,它就會把它作爲擴展方法的目的。 –

+0

當然,這不是調用擴展方法的首選方式,但您聲稱不可能出現哪種錯誤。 – codymanix

1

我認爲這個問題是你調用String.F,當擁有該方法的類是MyExtensions;不是字符串...如果你想這樣調用它,它應該是MyExtensions.F(「test {0}」,「test」)

正如其他人所提到的,雖然這是完全有效的,但它似乎迴避了使擴展方法截然不同的東西。

做「test {0}」。F(「test」);應該給出與MyExtensions.F相同的結果(「test {0}」,「test」);如果F不是作爲擴展方法設置的,則只有後一種方法纔是有效的。

+0

最終這些解決方案中的任何一個都可以工作,但是練習的要點是創建一個簡單的速記。因此,我會使用「test {0}」。F(「test」)或使用靜態方法「F(string,params)」創建一個名爲「s」的類。我想這讓我變成一個懶惰的程序員! – davewilliams459

+0

@dave:是的,任何一種方法都可以,但如果你將方法標記爲擴展名,那麼可能最好使用它們......我提供的答案主要是迴應Bala R的答案,它似乎給人的印象原始錯誤是無效使用的錯誤之一,而不僅僅是錯誤的名稱。 (通過評論他清除了這一點,雖然)。要清楚,我不是必需的。主張直接通過它的容器類調用擴展方法,但我想指出你所做的事情仍然很好(除了引用錯誤的類名:)) – Steven

相關問題