【问题标题】:Extension method can't implement ToString扩展方法无法实现 ToString
【发布时间】:2018-06-18 16:27:50
【问题描述】:

我正在尝试使用扩展方法在没有它的类中实现ToString()。如果我将方法声明更改为ToString2(),它可以正常工作,但是当我尝试使用.ToString 时它会失败。为什么ToString2() 有效,而ToString() 无效?

错误:

System.NullReferenceException:对象引用未设置为对象的实例。

这是我的方法实现:

namespace LeankitExtensions
{
    public static class CardViewExt
    {
        public static string ToString(this CardView c)
        {
            if (c == null)
                return "null card";

            return String.Format("-------\nexternal id: {0} \ntitle: {1}\n-------",c.ExternalCardID,c.Title);
        }
    }
}

调用方法:

CardView cv = new CardView(){ExternalCardID="22";Title="Hi"};
Console.WriteLine(cv.ToString());

【问题讨论】:

  • 因为 ToString() 是 Object 类的方法,如果要使用方法名 ToString() 需要重写基类的版本。
  • 德拉特错过了。请提出作为答案
  • 作为答案添加。
  • 这能回答你的问题吗? How to create an extension method for ToString?

标签: c# namespaces extension-methods


【解决方案1】:

因为 ToString() 是 Object 类的方法,如果你想使用方法名 ToString() 你需要覆盖它的基类版本。您将无法创建名为 ToString() 的扩展方法,因为基类 Object 中已经存在该方法。如果您想将此作为扩展方法,请将其称为 CardViewToString()

【讨论】:

    【解决方案2】:

    默认情况下,C# 中的每个类都继承自 Object 类,该类具有一些我们可以覆盖的方法,其中三个是 ToString()、Equals() 和 GetHashCode()。

    现在您的代码的问题是,您不是在 CardView 类中覆盖 ToString() 方法,而是创建扩展方法。您应该做的是覆盖 CardView 类中的 ToString() 方法,如下面的代码所示。

        public override string ToString()
        {
    
            //if (this == null) -- Not needed because the ToString() method will only be available once the class is instantiated.
            //    return "null card";
    
            return String.Format("-------\nexternal id: {0} \ntitle: {1}\n-------", this.ExternalCardID, this.Title);
        }
    

    但是,如果 CardView 类位于某个您无法编辑的 DLL 中,我建议您使用其他名称创建一个扩展方法,如下所示。

    public static class CardViewExt
    {
        public static string ToStringFormatted(this CardView c)
        {
            if (c == null)
                return "null card";
    
            return String.Format("-------\nexternal id: {0} \ntitle: {1}\n-------", c.ExternalCardID, c.Title);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-18
      • 1970-01-01
      • 1970-01-01
      • 2011-06-26
      • 1970-01-01
      • 2020-06-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多