我的类应该使用什么接口或方法在Console.WriteLine中打印我想要的内容?

时间:2008-10-09 18:40:49

标签: c# .net console-application console.writeline

我有一个F类的对象。我想使用Console.WriteLine输出对象的内容,以便快速和脏状态更新,如下所示:

Console.WriteLine(objectF);

这只会打印出控制台类的名称:

F

我想以某种方式重载这个,以便我可以打印出一些关于对象及其属性的有用信息。

我已经有一个解决方法:在我的类中重载ToString方法,然后调用: Console.WriteLine(objectF.ToString());

但我宁愿使用更简单的语法。有什么想法吗?

4 个答案:

答案 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;
}

感谢下面的海报让我走上正轨