如何为ToString创build扩展方法?

我试过这个:

public static class ListHelper { public static string ToString<T>(this IList<String> list) { return string.Join(", ", list.ToArray()); } public static string ToString<T>(this String[] array) { return string.Join(", ", array); } } 

但是对于string[]List<string>都不起作用。 也许我需要一些特殊的注释?

只有在没有适用的候选方法匹配的情况下,才会检查扩展方法。 在调用ToString()的情况下, 总会有一个适用的候选方法,即ToString() on object 。 扩展方法的目的是扩展一个types可用的方法集,而不是覆盖现有的方法; 这就是为什么他们被称为“扩展方法”。 如果你想覆盖现有的方法,那么你将不得不作出重写的方法。

这听起来像你想要replace什么files.ToString()返回。 如果不编写自定义的类来分配files (即从Listinheritance,并覆盖ToString() ),你将无法做到这一点。)

首先,摆脱genericstypes( <T> ),你没有使用它。 接下来,您将需要重命名扩展方法,因为调用files.ToString()将只调用List的ToString方法。

这就是你要找的。

 static class Program { static void Main() { var list = new List<string> { {"a"}, {"b"}, {"c"} }; string str = list.ToStringExtended(); } } public static class ListHelper { public static string ToStringExtended(this IList<String> list) { return string.Join(", ", list.ToArray()); } } 

只要你不应该使用名称ToString的扩展方法,因为它永远不会被调用,因为该方法已经存在, 你不应该使用T作为它的无用。

例如,我试了这个,并再次返回相同的东西:

 Console.WriteLine(lst.ToString<int>()); 

输出:

 shekhar, shekhar, shekhar, shekhar 

所以这次我使用int ,它仍然运行,因为T没有其他改变方法原型。

所以简单地说,为什么你使用ToString Literal作为方法的名字,因为它已经存在,你不能在一个扩展方法中覆盖它 ,这就是你不得不用T来通用它的原因。 使用一些不同的名字

 public static string ToMyString(this IList<String> list) 

这样你就不必使用通用的,因为它在那里没用,你可以直接调用它。


这就是说你的代码是为我工作的。 这是我试过的( 在LINQPAD中 ):

 void Main() { List<string> lst = new List<string>(); lst.Add("shekhar"); lst.Add("shekhar"); lst.Add("shekhar"); lst.Add("shekhar"); lst.ToString<string>().Dump(); } public static class ListHelper { public static string ToString<T>(this IList<String> list) { return string.Join(", ", list.ToArray()); } public static string ToString<T>(this String[] array) { return string.Join(", ", array); } } 

产量是shekhar, shekhar, shekhar, shekhar

因为你已经在ToString<T>指定了T ,所以在调用ToString方法时,你需要提到一个types如string或者int