【问题标题】:How to override ToString() in [] array?如何覆盖 [] 数组中的 ToString()?
【发布时间】:2013-11-02 20:49:59
【问题描述】:

说,如果我需要在自定义 List 中覆盖 ToString 方法,我会这样做:

public class WebUILanguage2 : List<WebUILanguage>
{
    public override string ToString()
    {
        return "Overridden message";
    }
}

但是如果我想覆盖它呢?

public class WebUILanguage2 : WebUILanguage[]

【问题讨论】:

  • 好吧,你的提议甚至不是有效的 C#,所以就这种情况提出进一步的问题是浪费时间。

标签: c# .net arrays overriding


【解决方案1】:

你不能。不能从数组类型派生。

我通常建议不要在 List&lt;T&gt; 中覆盖 ToString - 根据我的经验,通常使用组合比继承更好。

【讨论】:

  • 我只需要一个自定义的ToString 方法。所以,也不要,哈?
  • @ahmd0 您可以使用扩展方法,例如,IList&lt;T&gt; 并以您想要的方式打印它。
  • @ahmd0:不。您根本无法创建自己的扩展数组类型的类型。这在 C# 中是不可能的。
  • @SargeBorsch:不过你需要给它一个不同的名字——只是 ToString() 永远不会被称为扩展方法,因为只有在正常的成员查找失败时才会咨询扩展方法。跨度>
  • @ahmd0:恐怕你需要以不同的方式设计它。您可以将某些属性应用到该属性,以便 PropertyGrid 以不同方式显示它 - 但您只是将能够覆盖 ToString
【解决方案2】:

如前所述,你不能那样做。但作为一种解决方法,您可以简单地编写一个新方法:

using System;
static class Program {
   static string Str(this string[] a) => String.Join(',', a);
   static void Main() {
      string[] a = {"May", "June"};
      Console.WriteLine(a.Str());
   }
}

或函数:

using System;
class Program {
   static string Str(string[] a) => String.Join(',', a);
   static void Main() {
      string[] a = {"May", "June"};
      Console.WriteLine(Str(a));
   }
}

或者泛型函数:

using System.Collections.Generic;
using System;
class Program {
   static string Str(IEnumerable<string> a) => String.Join(',', a);
   static void Main() {
      string[] a = {"May", "June"};
      Console.WriteLine(Str(a));
   }
}

【讨论】:

  • 对于一般情况,这是正确的,但(来自 cmets)OP 希望 PropertyGrid 自动获取正确的表示
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多