如何为ToString创建扩展方法?

时间:2011-02-13 04:49:30

标签: 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)
    {
        return string.Join(", ", array);
    }
}

但它对string[]List<string>都不起作用。也许我需要一些特殊的注释?

3 个答案:

答案 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方法时需要提及类似stringint的类型。