我有一个 F 类的对象。我想使用 Console.WriteLine 输出对象的内容,以便像这样进行快速和肮脏的状态更新:
Console.WriteLine(objectF);
这仅将类的名称打印到控制台:
F
我想以某种方式重载它,以便我可以打印出一些关于对象及其属性的有用信息。
我已经有一个解决方法:在我的类中重载 ToString 方法,然后调用: Console.WriteLine(objectF.ToString());
但我宁愿使用更简单的语法。有任何想法吗?
我有一个 F 类的对象。我想使用 Console.WriteLine 输出对象的内容,以便像这样进行快速和肮脏的状态更新:
Console.WriteLine(objectF);
这仅将类的名称打印到控制台:
F
我想以某种方式重载它,以便我可以打印出一些关于对象及其属性的有用信息。
我已经有一个解决方法:在我的类中重载 ToString 方法,然后调用: Console.WriteLine(objectF.ToString());
但我宁愿使用更简单的语法。有任何想法吗?
Console.WriteLine(objectF)
应该可以工作,如果你超载ToString
. 当框架需要将对象转换为字符串表示时,它会调用ToString
.
public override string ToString()
{
// replace the line below with your code
return base.ToString();
}
您应该覆盖 ToString() 尽管在某些情况下您可能会发现以下代码很有用:
public static class ObjectUtility
{
public static string ToDebug(this object obj)
{
if (obj == null)
return "<null>";
var type = obj.GetType();
var props = type.GetProperties();
var sb = new StringBuilder(props.Length * 20 + type.Name.Length);
sb.Append(type.Name);
sb.Append("\r\n");
foreach (var property in props)
{
if (!property.CanRead)
continue;
// AppendFormat defeats the point
sb.Append(property.Name);
sb.Append(": ");
sb.Append(property.GetValue(obj, null));
sb.Append("\r\n");
}
return sb.ToString();
}
}
用法是简单地包含包含 ObjectUtility 的命名空间,然后...
var f = new F();
Console.WriteLine(f.ToDebug());
上面的反射用法对于高性能代码不是很好,所以不要在需要高性能的生产场景中使用它。
我会继续使用 ToString()。这就是它存在的目的。此外,除非您有格式字符串,否则您可以只写:
Console.WriteLine(objectF)
我找到了我的问题的原因。我忽略了将 ToString() 的实现定义为override。正确的语法是:
public override string ToString()
{
///Do stuff...
return string;
}
感谢下面的海报让我走上正轨