如何为ToString创建扩展方法?

66

我已经尝试过这个:

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个回答

134

如果有适用的候选方法,则仅检查扩展方法。在调用ToString()时,总会存在一个适用的候选方法,即object上的ToString()。扩展方法的目的是 扩展 类型可用的方法集,而不是 覆盖 现有方法; 这就是为什么它们被称为“扩展方法”的原因。如果您想要覆盖现有方法,则必须创建一个覆盖方法。


3
  1. MSDN 的参考链接: http://msdn.microsoft.com/en-us/library/bb383977.aspx(请参见示例部分)。
- madhurtanwani

6

简单来说,你不应该使用名称为 ToString 的扩展方法,因为它永远不会被调用,因为该方法已经存在,而且在那里使用 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方法时指定了ToString<T>中的T,因此需要在调用ToString方法时提供类型,如stringint


然而,当我调用 files.ToString<string>() 时它确实起作用 :) 它比 files 更长,但我仍然喜欢它 :) - IAdapter
就像我在一开始所说的,我在LINQPAD中运行了这段代码,那里有一个Dump()方法可以查看对象内部的内容。在普通的C#程序中,只需调用Console.WriteLine(lst.ToString<string>());即可。 - Shekhar_Pro
2
你可以将任何东西作为T传递进去,它都能正常工作。你在方法中没有使用泛型类型。例如:files.ToString<string>()、files.ToString<int>()、var str = list.ToString<Dictionary<int, string>>()等。 - matt.dolfin

6

听起来你想替换files.ToString()返回的内容。如果不编写自定义类来分配files(即从List继承并覆盖ToString()),则无法实现。

首先,去掉泛型类型(<T>),因为你没有使用它。接下来,你需要重命名扩展方法,因为调用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());
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接