代码之家  ›  专栏  ›  技术社区  ›  B Seven

如何重写ToString()并实现泛型?

  •  1
  • B Seven  · 技术社区  · 14 年前

    1. 如何重写ToString()?它说:静态成员…ToString(System.Collections.Generic.List)不能标记为override、virtual或abstract。

    2. 如何使其通用?

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

    4 回复  |  直到 14 年前
        1
  •  3
  •   Iain    14 年前

    你想达到什么目的?通常我想输出列表的内容,因此创建了以下扩展方法:

    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
    
        3
  •  5
  •   Anthony Pegram    14 年前

    如果要覆盖 ToString() List<T> 而不是试图扩展它。您已经看到不能将静态扩展方法标记为重写,并且重载解析将始终使用成员方法而不是扩展方法(如果该方法可用)。你的选择是

    • 继承和重写
    • ToSpecialString()
    • 直接使用类名调用方法 MyExtensions.ToString(myList);
        4
  •  1
  •   Alastair Pitts    14 年前

    只有继承基类时才能重写方法。

    我主张的是调用你的扩展方法 .ToCsv() .