2010-11-04 97 views
0

我有,我想作以下修改代碼:如何覆蓋ToString()並實現泛型?

  1. 如何重寫的ToString()?它說:靜態成員... ToString(System.Collections.Generic.List)'不能被標記爲覆蓋,虛擬或抽象。

  2. 如何使其具有通用性?

    public static override string ToString(this List<int> list) { 
        string output = ""; 
        list.ForEach(item => output += item.ToString() + ","); 
        return output; 
    } 
    

謝謝!

回答

3

什麼是你想實現方法直接?我常常想輸出列表中的內容,所以我創建了下面的擴展方法:

public static string Join(this IEnumerable<string> strings, string seperator) 
{ 
    return string.Join(seperator, strings.ToArray()); 
} 

它是那麼消耗這樣

var output = list.Select(a.ToString()).Join(","); 

編輯:爲了更方便地使用非字符串列表,這裏是上述

public static String Join<T>(this IEnumerable<T> enumerable, string seperator) 
{ 
    var nullRepresentation = ""; 
    var enumerableAsStrings = enumerable.Select(a => a == null ? nullRepresentation : a.ToString()).ToArray(); 
    return string.Join(seperator, enumerableAsStrings); 
} 

public static String Join<T>(this IEnumerable<T> enumerable) 
{ 
    return enumerable.Join(","); 
} 

現在你可以使用它像這樣

另一個變化
int[] list = {1,2,3,4}; 
Console.WriteLine(list.Join()); // 1,2,3,4 
Console.WriteLine(list.Join(", ")); // 1, 2, 3, 4 
Console.WriteLine(list.Select(a=>a+".0").Join()); // 1.0, 2.0, 3.0, 4.0 
+0

給出一個{5,10,20}的列表,我想得到字符串「5,10,20」。而且,我希望它適用於許多數據類型,如int,double,string,bool等。 – 2010-11-04 05:13:46

+0

我添加了更適合您的需求的Join方法的新變體。總的來說,我發現它是單元測試和調試時非常有用的方法。您也可以使用「\ n」作爲分隔符將每個列表項目放到一個新行中。 – Iain 2010-11-04 06:12:29

1

如果您繼承基類,則只能覆蓋方法。

我主張的是打電話給你的擴展方法.ToCsv()

3

您不能使用擴展方法來覆蓋現有的方法。

從規範http://msdn.microsoft.com/en-us/library/bb383977.aspx

「您可以使用擴展方法來擴展一個類或接口,而不是將其覆蓋。擴展方法具有相同的名稱和簽名作爲一個接口或類方法永遠不會被調用。在編譯時,擴展方法總是比類型本身定義的實例方法具有更低的優先級。「

4

如果你想覆蓋ToString(),你需要繼承List<T>而不是試圖擴展它。您已經看到您不能將靜態擴展方法標記爲覆蓋,並且重載解析將始終針對擴展方法上的成員方法(如果可用)進行。你的選擇是

  • 繼承和覆蓋
  • 更改擴展方法的名稱到別的東西ToSpecialString()
  • 呼叫使用類名MyExtensions.ToString(myList);