我有一个F类的对象。我想使用Console.WriteLine输出对象的内容,以便快速和脏状态更新,如下所示:
Console.WriteLine(objectF);
这只会打印出控制台类的名称:
F
我想以某种方式重载这个,以便我可以打印出一些关于对象及其属性的有用信息。
我已经有一个解决方法:在我的类中重载ToString方法,然后调用: Console.WriteLine(objectF.ToString());
但我宁愿使用更简单的语法。有什么想法吗?
答案 0 :(得分:6)
Console.WriteLine(objectF)
如果你超载ToString
,应该可行。当框架需要将对象转换为字符串表示时,它会调用ToString
。
public override string ToString()
{
// replace the line below with your code
return base.ToString();
}
答案 1 :(得分:2)
您应该覆盖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());
上面的反射用法对于高性能代码并不是很好,所以不要在需要高性能的生产场景中使用它。
答案 2 :(得分:1)
我会继续使用ToString()。这是它存在的目的。另外,除非你有格式字符串,否则你可以写:
Console.WriteLine(objectF)
答案 3 :(得分:1)
我找到了问题的原因。我忽略了将ToString()的实现定义为覆盖。正确的语法是:
public override string ToString()
{
///Do stuff...
return string;
}
感谢下面的海报让我走上正轨