[英]Override ToString or provide non-ToString named extension method for an interface?
[英]How to create an extension method for ToString?
我试过这个:
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()
的情况下, 总会有一个适用的候选方法,即object
上的ToString()
。 的扩展方法的目的是延长上的类型的可用的一套方法,不重写现有的方法; 这就是为什么他们被称为“扩展方法”。 如果要覆盖现有方法,则必须创建重写方法。
听起来你想要替换什么文件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());
}
}
只是你不应该使用名称ToString
作为Extension方法,因为它永远不会被调用,因为该方法已经存在, 你不应该使用T
作为它无用的。
例如,我试过这个,并再次返回相同的东西:
Console.WriteLine(lst.ToString<int>());
输出:
shekhar, shekhar, shekhar, shekhar
所以这次我使用int
并且它仍然运行,因为T没有用,然后改变方法原型。
所以,简单地为什么您使用ToString
文字作为方法名称,因为它已经存在,你不能在一个扩展方法来覆盖它 ,这是你必须使用,之所以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方法时需要提及类似string
或int
的类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.