2009-10-13 22 views
2

我使用泛型Java代碼轉換爲C#和具有的那種容器麻煩:使用泛型在C#中的擴展功能

public static class MyExtensions 
{ 
    public static void add(this List<object> list, object obj) 
    { 
     list.Add(obj); 
    } 
    public static void add(this List<string> list, string s) 
    { 
     list.Add(s); 
    } 
} 

看來,仿製藥在比較參數丟失,這兩種方法相撞。我希望能夠以這種方式使用泛型。是否有可能支持所有列表操作:單一的:

public static void add(this List<object> list, object obj) 
    { 
     list.Add(obj); 
    } 

例如?

摘要所有響應都有相同的解決方案。 列表可以抽象爲ICollection。總體而言,這可能不是生產代碼的好主意。

+0

你是什麼意思的「兩種方法相撞」?顯示的類編譯沒有錯誤。 – 2009-10-13 19:16:21

+0

當我調用形式爲myList.add(foo)的方法時,它會報告比找不到正確的方法 - 它有錯誤的參數 – 2009-10-13 19:31:01

+0

請確保通過「using MyExtensionsNamespace」將此類的名稱空間包含在文件中。 – 2009-10-13 19:39:52

回答

10

如何:

public static void add<T>(this IList<T> list, T value) 
{ 
    list.Add(value); 
} 

(實際上,它可能是ICollection<T>,因爲這(不IList<T>)定義Add(T)

5

你試過:

public static void add<T>(this List<T> list, T obj) 
{ 
    list.Add(obj); 
} 

我不是當然,如果你想限制它到一個班級,但這應該做你所描述的。

5

你的意思是這樣的:

public static void add<T>(this List<T> list, T obj) 
{ 
    list.Add(obj); 
} 
5

我覺得Marc Gravell answered this best,但我會補充:

別這樣做的。有沒有優勢:

myList.add(obj); 

VS

myList.Add(obj); 

唯一的「優勢」在這裏,你得到的C#看起來錯誤的大多數開發人員。如果您要從Java移植到C#,那麼值得花費額外的時間使您的方法看起來像本地.NET方法一樣工作。

+0

@Reed我同意。這是一個臨時解決方案,可以查看代碼端口的輕鬆程度。它將避免由於過度的自動編輯而造成的錯誤。當系統編譯時,我將決定我們如何走向更好的解決方案。 – 2009-10-13 19:57:30

0

最通用的方式:

public static void add<T>(this ICollection<T> list, T obj) // use ICollection<T> 
{ 
    list.Add(value); 
} 
0

@Dreamwalker,你是什麼意思? list.Add(obj);