使用泛型在C#中的扩展功能

问题描述:

我使用泛型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

如何:

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

(实际上,它可能是ICollection<T>,因为这(不IList<T>)定义Add(T)

你试过:

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

我不是当然,如果你想限制它到一个班级,但这应该做你所描述的。

你的意思是这样的:

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

我觉得Marc Gravell answered this best,但我会补充:

别这样做的。有没有优势:

myList.add(obj); 

VS

myList.Add(obj); 

唯一的“优势”在这里,你得到的C#看起来错误的大多数开发人员。如果您要从Java移植到C#,那么值得花费额外的时间使您的方法看起来像本地.NET方法一样工作。

+0

@Reed我同意。这是一个临时解决方案,可以查看代码端口的轻松程度。它将避免由于过度的自动编辑而造成的错误。当系统编译时,我将决定我们如何走向更好的解决方案。 – 2009-10-13 19:57:30

最通用的方式:

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

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