【问题标题】:How can I override ToString() method for all IEnumerable<Int32>?如何覆盖所有 IEnumerable<Int32> 的 ToString() 方法?
【发布时间】:2012-03-14 07:05:23
【问题描述】:

我想在IEnumerable&lt;Int32&gt; 上覆盖ToString()

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

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

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

例如,当我在 List&lt;Int32&gt; 上调用 .ToString() 时,我该如何实现这一点,以便调用我的 ToString() 实现?

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

【问题讨论】:

  • 这个问题有点不清楚。您想为IEnumerable&lt;T&gt;T(在本例中为Int32)覆盖ToString?请注意,您不能覆盖其中任何一个,但不同的解决方案可能适用于每种情况。
  • 我想覆盖“IEnumerable ”上的 ToString()。 (由于某种原因堆栈溢出删除了原文中的。)
  • 使用反引号添加内联代码示例,我已经编辑了您的问题,只需点击编辑按钮即可查看我所做的。

标签: c# .net overriding extension-methods


【解决方案1】:

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

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

我建议你给你的方法一个不同的名字,避免这个问题 - 和你的方法可能引起的混乱

请注意,即使扩展方法 优先于在 object 上声明的(比如)方法匹配,它只会对使用适当的 using 指令编译您自己的代码产生影响- 不是已经将调用绑定到正常调用的任何其他代码。

如果您能提供更多关于您想要实现的目标的信息,我们或许可以为您提供更多帮助 - 但目前,像 ToDelimitedString(或任何您的方法)听起来是最好的选择我。

【讨论】:

    【解决方案2】:

    您不能替换使用扩展方法的方法。

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

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

    要么使用重写的 ToString 方法创建您自己的 IEnumerable&lt;T&gt; 类型,要么使用不同的方法名称。当然,使用您自己的类型当然只有在您实际使用该类型时才有效。

    【讨论】:

      【解决方案3】:

      无法覆盖 ToString,但您可以在使用 IEnumerable&lt;Int32&gt; 的每个地方调用 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>

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

      【讨论】:

        【解决方案4】:

        您不能覆盖 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());
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-08-20
          • 1970-01-01
          • 1970-01-01
          • 2018-01-10
          • 2018-07-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多