2012-03-14 33 views
4

我想覆蓋IEnumerable<Int32>上的ToString()如何覆蓋所有IEnumerable <Int32>的ToString()方法?

我在想使用擴展方法。

但是,當我這樣做下面,它仍然調用ToString()System.Object。當我重命名我的方法時,它會調用我的方法。

由於我的擴展方法是在靜態類中,我無法重寫。

例如,如何在List<Int32>上調用.ToString()時調用我的ToString()實現?

public static class ExtensionMethods 
{ 
    public static new string ToString(this IEnumerable<Int32> set) 
    { 
     var sb = new StringBuilder(); 

     // Do some modifications on sb 

     return sb.ToString(); 
    } 
} 
+0

這個問題是有些不清楚。你想爲'IEnumerable '還是'T'(在這種情況下是'Int32')覆蓋'ToString'?請注意,您無法重寫,但每種情況下都可能適用不同的解決方案。 – 2012-03-14 07:08:18

+0

我想覆蓋「IEnumerable < Int32 >」上的ToString()。 (出於某種原因,原始文本中刪除了) – pencilCake 2012-03-14 07:10:34

+0

使用反引號添加內聯代碼示例,我編輯了您的問題,只需點擊編輯按鈕即可查看我做了什麼。 – 2012-03-14 07:11:52

回答

9

如何實現這個功能,以便在我調用List上的.ToString()時調用ToString()實現?

你基本上不能。擴展方法爲,只有用於未找到匹配的實例方法。

我建議你給你的方法一個不同的名稱,以避免問題 - 和你的方法可能導致的潛在困惑。沒有它已經任何其他代碼 -

請注意,即使擴展方法優先匹配上object聲明(說)方法,只會讓你自己的代碼的差異與適當的using指令被編譯將呼叫綁定到正常的呼叫。

如果您可以提供更多關於您想要實現的信息,我們可能會幫助您更多 - 但目前,類似ToDelimitedString(或任何您的方法所做的操作)聽起來像是我最好的選擇。

3

不能取代使用擴展方法的方法。

方法解析將檢查屬於該類型的方法,然後試圖找到匹配的擴展方法。

換句話說,你不能代替ToString,但是,你可以創建你自己的方法。

要麼創建自己的IEnumerable<T>類型與覆蓋的ToString方法,要麼使用不同的方法名稱。當然,使用你自己的類型當然只會在你使用這個類型時實際上是

0

這是不可能重寫的ToString,但你can create a wrapper,你可以在每一個地方打電話,你在哪裏使用IEnumerable<Int32>

要輸出的集合作爲字符串我使用的擴展方法

public static string ToString<T>(this IEnumerable<T> messages) 
{ 
     return ToString<T>(messages, Environment.NewLine, ""); 
} 



ToString<T>( this IEnumerable<T>messages, string separator, string sComment) 

在我的崗位描述 ToString function for Generic List

又見類似的帖子中描述的擴展方法來實現Overriding ToString() of List<MyClass>

類似的功能: Separator Delimited ToString for Array, List, Dictionary, Generic IEnumerable