【问题标题】:How do I override ToString() and implement generic?如何覆盖 ToString() 并实现泛型?
【发布时间】:2010-11-04 02:50:40
【问题描述】:

我有想要进行以下更改的代码:

  1. 如何覆盖 ToString()?它说:静态成员 ...ToString(System.Collections.Generic.List)' 不能标记为覆盖、虚拟或抽象。

  2. 如何使其通用?

    public static override string ToString(this List<int> list) {
        string output = "";
        list.ForEach(item => output += item.ToString() + "," );
        return output;
    }
    

谢谢!

【问题讨论】:

    标签: c# .net generics extension-methods overriding


    【解决方案1】:

    您不能使用扩展方法来覆盖现有方法。

    来自规范http://msdn.microsoft.com/en-us/library/bb383977.aspx

    "你可以使用扩展方法来扩展一个类或接口,但不能覆盖它们。与接口或类方法具有相同名称和签名的扩展方法永远不会被调用。在编译时,扩展方法总是有比在类型本身中定义的实例方法的优先级低。”

    【讨论】:

      【解决方案2】:

      如果您想覆盖ToString(),您需要从List&lt;T&gt; 继承而不是尝试扩展它。您已经看到,您不能将静态扩展方法标记为覆盖,并且如果扩展方法可用,则重载决议将始终针对成员方法而不是扩展方法。您的选择是

      • 继承和覆盖
      • 将扩展方法的名称更改为其他名称ToSpecialString()
      • 直接使用类名MyExtensions.ToString(myList);调用方法

      【讨论】:

        【解决方案3】:

        你想达到什么目的?经常想输出一个列表的内容,所以创建了如下扩展方法:

        public static string Join(this IEnumerable<string> strings, string seperator)
        {
            return string.Join(seperator, strings.ToArray());
        }
        

        然后就这样消费了

        var output = list.Select(a.ToString()).Join(",");
        

        编辑:为了更容易用于非字符串列表,这里是上面的另一种变体

        public static String Join<T>(this IEnumerable<T> enumerable, string seperator)
        {
            var nullRepresentation = "";
            var enumerableAsStrings = enumerable.Select(a => a == null ? nullRepresentation : a.ToString()).ToArray();
            return string.Join(seperator, enumerableAsStrings);
        }
        
        public static String Join<T>(this IEnumerable<T> enumerable)
        {
            return enumerable.Join(",");
        }
        

        现在你可以这样消费了

        int[] list = {1,2,3,4};
        Console.WriteLine(list.Join()); // 1,2,3,4
        Console.WriteLine(list.Join(", ")); // 1, 2, 3, 4
        Console.WriteLine(list.Select(a=>a+".0").Join()); // 1.0, 2.0, 3.0, 4.0
        

        【讨论】:

        • 给定一个 { 5, 10, 20 } 的列表,我想得到字符串“5,10,20”。而且,我希望它适用于许多数据类型,例如 int、double、string、bool 等。
        • 我添加了一个新的 Join 方法,它更适合您的需求。总的来说,我发现它在单元测试和调试时是一种非常有用的方法。您还可以使用“\n”作为分隔符将每个列表项换行。
        【解决方案4】:

        只有继承基类才能覆盖方法。

        我提倡的是调用你的扩展方法.ToCsv()

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-06-22
          • 2012-09-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多