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());
    }
}