扩展方法无法实现ToString

时间:2018-06-18 16:27:50

标签: c# namespaces extension-methods

我正在尝试使用扩展方法在没有它的类中实现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());

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分: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);
    }
}