【问题标题】:A way to pretty print a C# object一种漂亮打印 C# 对象的方法
【发布时间】:2011-09-12 15:33:23
【问题描述】:

我有一个文本框,我想以人类可读的方式在其中显示一个 C# 对象,只是出于调试原因。如果可能的话,我不想使用外部库。我该怎么做?

【问题讨论】:

  • 显示 C# 对象是什么意思?显示它的全名、它的属性还是什么?

标签: c# pretty-print


【解决方案1】:

这对我来说非常有用:

string SerilizedText = "";
RootClass myclass= new Root RootClass ();
SerilizedText = JsonConvert.SerializeObject(myclass,Newtonsoft.Json.Formatting.Indented) ;

【讨论】:

    【解决方案2】:

    如果您使用 Json,那么我建议您使用 Newtonsofts Json 库,然后您可以以 Json 表示法输出整个对象,它会使用间距和换行符对其进行格式化。我们已经使用它来轻松地显示复杂对象以进行调试:

    var jsonString = JsonConvert.SerializeObject(
               complexObject, Formatting.Indented,
               new JsonConverter[] {new StringEnumConverter()});
    

    这里我还使用了字符串枚举转换器,以便将枚举显示为其字符串表示形式,而不是整数。

    该库可通过 NuGet 作为 Json.Net 或 Newtonsoft Json 获得

    或者你可以在这里得到它:

    https://www.newtonsoft.com/json

    【讨论】:

    • 很好的答案,示例有效,但调用要序列化的对象property 有点误导。或者我错过了什么?
    【解决方案3】:

    一个简单的方法是覆盖ToString 方法。

    这是一个链接:How to override ToString

    【讨论】:

      【解决方案4】:

      覆盖.ToString() 方法。

      【讨论】:

        【解决方案5】:
        1. 安装包ServiceStack.Text
        2. obj.Dump();

        如果您不想使用外部库,请编写自己的 Dump() 扩展方法。

        【讨论】:

        • obj.ToDump() 让 VS 找到合适的包来帮助你使用 include
        【解决方案6】:

        我也用过一段时间的 Json;但现在我创建了一个PrettyPrint-Minimod。您可以通过 Nuget 添加它(它是一个源代码发行版)。在这里找出Minimod 是什么。

        它可以很好地打印对象图,并且对枚举和字典有一些魔力。它还试图找出正确的换行符。

        我很快就会在博客上介绍它 - 但请继续尝试 :-)

        【讨论】:

          【解决方案7】:

          如果只是出于调试目的,请使用DebuggerDisplayAttribute

          使用此属性将更改对象在监视窗口的值部分中的外观(或在调试期间鼠标悬停时)

          用法:

          [DebuggerDisplay("Name = {FirstName} {LastName}")]
          public class Person {
            public string FirstName { get; set; }
            public string LastName { get; set; }
          
          }
          

          【讨论】:

            【解决方案8】:

            我经常使用它来用自定义对象填充列表框:

            public override string ToString()
            {
                return String.Format("{0}:{1}:{2}", Property1, Property2, Property3);
            }
            

            【讨论】:

              【解决方案9】:

              将其序列化为 JSON。它可以像其他人建议的那样在ToString() 方法中完成,但如果您仅将其用于调试,我认为这不合适。

              【讨论】:

              • 我实际上比自己滚动的 ToString() 更喜欢这个想法。 JSON 序列化将以比 XML 更“轻量”的格式显示每个公共字段及其值,而不会触及可能在其他地方使用的 ToString。这是一个简单的 ToJSON 扩展方法:weblogs.asp.net/scottgu/archive/2007/10/01/…
              • 一个快速而肮脏的例子在这里会很有用,特别是因为这可能是该语言的新手最需要的!
              • Newtonsoft 的JsonConvert 也有格式化选项Debug.WriteLine(JsonConvert.SerializeObject(myObject, Formatting.Indented))
              • 我在单元测试断言中使用漂亮的打印对象。这是断言所有字段都存在并具有特定值的快速方法( cut'n'paste )。单元测试生产的巨大加速。
              【解决方案10】:

              只需在您的类型上覆盖 ToString() 并提供您自己的格式化字符串以进行调试显示。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2010-09-13
                • 2013-01-20
                • 1970-01-01
                • 1970-01-01
                • 2016-04-26
                • 2012-02-09
                • 1970-01-01
                • 2011-05-25
                相关资源
                最近更新 更多