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