如何为ToString创建扩展方法?

IAd*_*ter 48 .net c# 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,这是行不通的,对于string[]List<string>.也许我需要一些特殊的注释?

Eri*_*ert 109

仅在没有匹配的适用候选方法时才检查扩展方法.在呼叫的情况下,ToString()始终存在适用的候选方法,即ToString()on object.的扩展方法的目的是延长上的类型的可用的一套方法,不重写现有的方法; 这就是为什么他们被称为"扩展方法".如果要覆盖现有方法,则必须创建重写方法.

  • +1.对MSDN的引用:http://msdn.microsoft.com/en-us/library/bb383977.aspx(参见示例部分) (2认同)

She*_*Pro 5

只是你不应该使用ToString扩展方法的名称,因为它永远不会被调用,因为该方法已经存在,你不应该T在那里使用它。

例如,我试过这个,它又返回了同样的东西:

Console.WriteLine(lst.ToString<int>());
Run Code Online (Sandbox Code Playgroud)

输出:

shekhar, shekhar, shekhar, shekhar
Run Code Online (Sandbox Code Playgroud)

所以这次我使用int它并且它仍然运行,因为除了更改方法原型之外,T 没有任何用处。

所以简单地说,为什么你使用ToStringLiteral 作为方法名称,因为它已经存在并且你不能在 Extension method 中覆盖它,这就是你必须使用它T来使其通用的原因。使用一些不同的名称,如

public static string ToMyString(this IList<String> list)
Run Code Online (Sandbox Code Playgroud)

这样你就不必使用泛型,因为它在那里没用,你可以像往常一样简单地调用它。


那就是说你的代码对我有用。这是我尝试过的(在 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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

输出是 shekhar, shekhar, shekhar, shekhar

既然你已经指定TToString<T>您需要提一类像stringint同时调用ToString方法。

  • 你可以将任何东西作为 T 传递,它会起作用。您没有在方法中使用泛型类型。files.ToString&lt;string&gt;()、files.ToString&lt;int&gt;()、var str = list.ToString&lt;Dictionary&lt;int、string&gt;&gt;() 等。 (2认同)

mat*_*fin 5

听起来你想要取代什么files.ToString()回报.如果不编写要分配的自定义类files(即从List和override继承),您将无法做到这一点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());
    }
}
Run Code Online (Sandbox Code Playgroud)