覆盖List <MyClass>的ToString()

Bru*_*eis 21 c# string extension-methods overriding tostring

我有一个类MyClass,我想覆盖List实例的方法ToString():

class MyClass
{
    public string Property1 { get; set; }
    public int Property2 { get; set; }
    /* ... */
    public override string ToString()
    {
        return Property1.ToString() + "-" + Property2.ToString();
    }
}
Run Code Online (Sandbox Code Playgroud)

我想要以下内容:

var list = new List<MyClass>
            {
                new MyClass { Property1 = "A", Property2 = 1 },
                new MyClass { Property1 = "Z", Property2 = 2 },
            };

Console.WriteLine(list.ToString());   /* prints: A-1,Z-2 */
Run Code Online (Sandbox Code Playgroud)

有可能这样做吗?或者我必须继承List <MyClass>来覆盖我的子类中的方法ToString()?我可以使用扩展方法解决这个问题(即,是否可以使用扩展方法覆盖方法)?

谢谢!

Luk*_*keH 25

也许有点偏离主题,但我使用的ToDelimitedString扩展方法适用于任何IEnumerable<T>.您可以(可选)指定要使用的分隔符,并使用委托为每个元素执行自定义字符串转换:

// if you've already overridden ToString in your MyClass object...
Console.WriteLine(list.ToDelimitedString());
// if you don't have a custom ToString method in your MyClass object...
Console.WriteLine(list.ToDelimitedString(x => x.Property1 + "-" + x.Property2));

// ...

public static class MyExtensionMethods
{
    public static string ToDelimitedString<T>(this IEnumerable<T> source)
    {
        return source.ToDelimitedString(x => x.ToString(),
            CultureInfo.CurrentCulture.TextInfo.ListSeparator);
    }

    public static string ToDelimitedString<T>(
        this IEnumerable<T> source, Func<T, string> converter)
    {
        return source.ToDelimitedString(converter,
            CultureInfo.CurrentCulture.TextInfo.ListSeparator);
    }

    public static string ToDelimitedString<T>(
        this IEnumerable<T> source, string separator)
    {
        return source.ToDelimitedString(x => x.ToString(), separator);
    }

    public static string ToDelimitedString<T>(this IEnumerable<T> source,
        Func<T, string> converter, string separator)
    {
        return string.Join(separator, source.Select(converter).ToArray());
    }
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*ris 23

您需要子类来覆盖任何方法.泛型的意思是说你想要相同的行为而不管T的类型.如果你想要特定类型的T的不同行为,那么你打破了这个合同并且需要编写你自己的类:

public class MyTypeList : List<MyClass>
{
    public override string ToString()
    {
        return ...
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑添加:

不,您不能通过创建扩展来覆盖方法,但是您可以创建一个具有特定于此列表类型的不同签名的新方法:

public static string ExtendedToString(this List<MyClass> list)
{
     return ....
} 
Run Code Online (Sandbox Code Playgroud)

用于

List<MyClass> myClassList = new List<MyClass>
string output = myClassList.ExtendedToString();
Run Code Online (Sandbox Code Playgroud)

我仍然认为你的子类化更好......