如何为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
。