如何覆盖所有IEnumerable <int32>?</int32>的ToString()方法

时间:2012-03-14 07:05:23

标签: c# .net override extension-methods

我想覆盖ToString()上的IEnumerable<Int32>

我正在考虑使用扩展方法。

但是当我在下面执行此操作时,它仍会调用ToString()上的System.Object。当我重命名我的方法时,它会调用我的方法。

由于我的扩展方法是静态类,我无法覆盖。

我如何实现这一目标,以便在ToString()上呼叫.ToString()时调用我的List<Int32>实现?

public static class ExtensionMethods
{
    public static new string ToString(this IEnumerable<Int32> set)
    {
        var sb = new StringBuilder();

        // Do some modifications on sb

        return sb.ToString();
    }
}

4 个答案:

答案 0 :(得分:9)

  

我如何实现这一点,以便在我调用List上的.ToString()时调用我的ToString()实现?

基本上,你不能。如果找不到匹配的实例方法,则扩展方法仅

我建议你给你的方法一个不同的名字,避免问题 - 以及你的方法可能造成的混淆

请注意,即使扩展方法 优先于object上声明的(例如)方法匹配,也只会使用适当的{{编译自己的代码。 1}}指令 - 不是任何已经将调用绑定到正常调用的其他代码。

如果您可以提供有关您要实现的目标的更多信息,我们可以为您提供更多帮助 - 但目前,像using(或您的方法所做的)听起来像是最好的打赌我。

答案 1 :(得分:3)

您无法使用扩展方法替换方法。

方法解析将在尝试查找匹配的扩展方法之前检查属于该类型的方法。

换句话说,您无法替换ToString,但是,您可以创建自己的方法。

使用重写的IEnumerable<T>方法创建自己的ToString类型,或使用其他方法名称。当然,使用您自己的类型当然只有在您实际使用该类型时才会起作用。

答案 2 :(得分:0)

无法覆盖ToString,但您可以在IEnumerable<Int32>

的每个地方调用can create a wrapper

要将集合输出为字符串,我使用的是扩展方法

public static string ToString<T>( this IEnumerable<T> messages)
{ 
     return ToString<T>(messages, Environment.NewLine, "" );
}



ToString<T>( this IEnumerable<T>messages, string separator, string sComment)

在我的帖子中描述 ToString function for Generic List

另请参阅类似的Overriding ToString() of List<MyClass>

类似的功能实现为post中描述的扩展方法: Separator Delimited ToString for Array, List, Dictionary, Generic IEnumerable

答案 3 :(得分:0)

您不能覆盖ToString,但是可以创建通用方法。

这是基于Michael Freidgeim的答案(链接已断开)的简单解决方案:

static public class Extensions {

    // extension for arrays, lists, any Enumerable -> AsString
    public static string AsString<T>(this IEnumerable<T> enumerable) {
        var sb = new StringBuilder();
        int inx = 0;
        foreach (var item in enumerable) {
            sb.Append($"{inx}: {item}\r\n");
            inx++;
        }
        return sb.ToString();
    }
}

用法:

Console.WriteLine(arr.AsString());
Console.WriteLine(list.AsString());
Console.WriteLine(linqResult.AsString());