C#对象美化打印的方法

79

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


1
显示 C# 对象是什么意思?显示其完整名称、属性还是其他内容? - Erick Petrucelli
10个回答

133
如果您使用Json,则建议使用Newtonsoft的Json库,然后可以以Json符号输出整个对象,并且它将用间隔和换行符进行格式化。我们已经使用它轻松地显示复杂对象以进行调试。
var jsonString = JsonConvert.SerializeObject(
           complexObject, Formatting.Indented,
           new JsonConverter[] {new StringEnumConverter()});

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

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

或者你可以在这里获取:

https://www.newtonsoft.com/json


很棒的答案,示例也能正常运行,但将要序列化的对象称为“property”有点误导人。或者我漏掉了什么? - z33k

32

如果只是为了调试目的,可以使用DebuggerDisplayAttribute

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

用法:

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

}

24

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


3
我喜欢这个想法比自己编写ToString()更好。使用JSON序列化可以以比XML更轻量级的方式显示每个公共字段及其值,而无需修改ToString,以防影响其他用途。以下是一个简单的ToJSON扩展方法:http://weblogs.asp.net/scottgu/archive/2007/10/01/tip-trick-building-a-tojson-extension-method-using-net-3-5.aspx - KeithS
一个快速而简单的例子在这里会很有用,特别是对于语言的新手来说可能最需要! - Redoman
9
Newtonsoft的JsonConvert可以提供格式化选项。 Debug.WriteLine(JsonConvert.SerializeObject(myObject, Formatting.Indented)) 可以实现对myObject进行格式化输出。 - jreancsu
我在单元测试断言中使用漂亮打印的对象。这是一种快速的方式(剪切和粘贴),可以断言所有字段都存在并具有特定值。这大大加快了单元测试的生产速度。 - Fred Haslam

7

这对我非常有效:

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

6

4
我曾经一段时间使用过Json;但现在我创建了一个名为 PrettyPrint-Minimod 的工具。你可以通过Nuget将其添加到项目中(它是一个源代码分发)。在此处了解什么是Minimod

它可以很好地打印对象图,对于可枚举和字典类型也有一些特殊处理。它还会尝试找出正确的换行位置。

我很快就会写关于它的博客 - 但你可以先试用一下 :-)


3

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


2
  1. 安装ServiceStack.Text包
  2. obj.Dump();

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


obj.ToDump() 允许VS查找正确的包来帮助您使用包含。 - BozoJoe

2

我经常用这个方法来使用自定义对象填充列表框:

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

0

重写.ToString()方法。


避免仅使用代码解决问题。请提供链接或描述,因为发帖者可能是一位经验不足的程序员。 - Matthew Swallow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接