CodeGo.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>都无效。也许我需要一些特殊的注释?

IAdapter asked 2020-02-12T20:24:33Z
3个解决方案
108 votes

仅在没有适用的候选方法匹配时才检查扩展方法。 在调用ToString()的情况下,将始终有一个适用的候选方法,即object上的ToString()。 这就是为什么它们被称为“扩展方法”的原因。 如果要覆盖现有方法,则必须制作一个覆盖方法。

Eric Lippert answered 2020-02-12T20:24:47Z
5 votes

听起来您想替换<T>返回的内容。 如果不编写自定义类将files.ToString()分配为(即从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());
    }
}
matt.dolfin answered 2020-02-12T20:25:16Z
4 votes

简而言之,您不应该为扩展方法使用名称T,因为它永远不会被调用,因为该方法已经存在,并且您不应在其中使用T作为其无用。

例如,我尝试了此操作,然后再次返回了相同的内容:

Console.WriteLine(lst.ToString<int>());

输出:

shekhar, shekhar, shekhar, shekhar

所以这一次我使用了T,它仍然可以运行,因为T除了更改方法原型外没有其他用途。

因此,简单地说,为什么要使用T文字作为方法名称,因为它已经存在,并且不能在扩展方法中覆盖它,这就是必须使用2744776556584371371201使其通用的原因。 使用其他名称,例如

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

输出为T

由于您已在ToString<T>中指定了T,因此您在调用ToString方法时需要提及类似stringint的类型。

Shekhar_Pro answered 2020-02-12T20:26:13Z
translate from https://stackoverflow.com:/questions/4982479/how-to-create-an-extension-method-for-tostring