我试过这个:
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>
都不起作用。也许我需要一些特殊的注释?
答案 0 :(得分:106)
仅当没有适用的候选方法匹配时,才会检查扩展方法。在致电ToString()
的情况下,总是是适用的候选方法,即ToString()
object
。扩展方法的目的是扩展类型上可用的方法集,而不是覆盖现有方法;这就是为什么他们被称为“扩展方法”。如果要覆盖现有方法,则必须制定覆盖方法。
答案 1 :(得分:5)
听起来你想要替换files.ToString()
返回的内容。如果不编写自定义类来指定files
,则无法执行此操作(即从List继承并覆盖ToString()
。)
首先,摆脱泛型类型(<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());
}
}
答案 2 :(得分:4)
只有不应使用名称 ToString
作为Extension方法,因为它永远不会被调用,因为该方法已经存在且你不应该使用T
作为无用的。
例如,我试过这个并再次返回同样的东西:
Console.WriteLine(lst.ToString<int>());
输出:
shekhar, shekhar, shekhar, shekhar
所以这次我使用int
并且它仍然运行,因为T没有用,然后更改方法原型。
因此,为什么您使用ToString
Literal作为方法名称,因为它已经存在且无法在Extension方法中覆盖它,这就是您必须使用的原因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
由于您在T
中指定了ToString<T>
,因此在调用ToString方法时需要提及类似string
或int
的类型。