C# 如何为ToString创建扩展方法?
我试过这个:C# 如何为ToString创建扩展方法?,c#,.net,tostring,C#,.net,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) {
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);
}
}
公共静态类ListHelper
{
公共静态字符串ToString(此IList列表)
{
返回字符串.Join(“,”,list.ToArray());
}
公共静态字符串ToString(此字符串[]数组)
{
返回字符串。Join(“,”数组);
}
}
但它不适用于
string[]
和List
。也许我需要一些特殊的注释?简单地说,您不应该为扩展方法使用
名称,因为它永远不会被调用,因为该方法已经存在,并且您不应该使用t
例如,我尝试了这个,但它再次返回相同的结果:
Console.WriteLine(lst.ToString<int>());
所以这次我使用了int
,它仍然运行,因为T除了更改方法原型之外没有其他用处
那么简单地说,为什么要使用ToString
Literal作为方法名,因为它已经存在,并且不能在扩展方法中重写它,这就是为什么必须使用t
使它成为泛型的原因。使用不同的名称,例如
public static string ToMyString(this IList<String> list)
公共静态字符串ToMyString(此IList列表)
这样你就不必使用泛型,因为它在那里毫无用处,你可以像往常一样简单地调用它
也就是说你的代码对我有用。以下是我在LINQPAD中尝试的():
void Main()
{
List lst=新列表();
第1条增补(“谢哈尔”);
第1条增补(“谢哈尔”);
第1条增补(“谢哈尔”);
第1条增补(“谢哈尔”);
lst.ToString().Dump();
}
公共静态类ListHelper
{
公共静态字符串ToString(此IList列表)
{
返回字符串.Join(“,”,list.ToArray());
}
公共静态字符串ToString(此字符串[]数组)
{
返回字符串。Join(“,”数组);
}
}
输出为shekhar,shekhar,shekhar,shekhar
由于您在
ToString
中指定了T
,因此在调用ToString方法时,您需要提到string
或int
之类的类型。听起来您想替换文件。ToString()
返回的内容。如果不编写自定义类将文件指定为(即从列表继承并重写ToString()
),您将无法执行此操作
首先,去掉泛型类型(
),因为您没有使用它。接下来,您需要重命名扩展名方法,因为调用files.ToString()
将只调用列表的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());
}
}
静态类程序
{
静态void Main()
{
var list=新列表{{“a”}、{“b”}、{“c”};
字符串str=list.toString扩展();
}
}
公共静态类ListHelper
{
公共静态字符串ToString扩展(此IList列表)
{
返回字符串.Join(“,”,list.ToArray());
}
}
只有在没有匹配的适用候选方法时,才会检查扩展方法。在调用ToString()
的情况下,总会有一个适用的候选方法,即对象上的ToString()
。扩展方法的目的是扩展类型上可用的方法集,而不是覆盖现有方法;这就是为什么它们被称为“扩展方法”。如果要重写现有方法,则必须创建一个重写方法。但是,当我调用files.ToString()时,它确实可以工作:)它比文件长,但我仍然喜欢:)正如我在开始时所说,我在LINQPAD中运行了这段代码,在那里我们有Dump()方法来查看对象内部的内容。。在普通C#程序中,只需调用Console.WriteLine(lst.ToString())代码>您可以将任何内容作为T传递,它将起作用。您没有在方法中使用泛型类型。files.ToString()、files.ToString()、var str=list.ToString()等+1。MSDN参考:(参见示例部分)
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);
}
}
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());
}
}