A way to pretty print a C# object
Asked Answered
T

10

80

I have a text box and I want to display a C# object in it in a human-readable way, just for debugging reasons. I don't want to use external libraries if possible. How do I do this?

Townswoman answered 10/6, 2011 at 16:21 Comment(1)
What do you mean by display a C# object? Display its full name, its properties or what?Pulsate
T
25

Serialize it to JSON. It can be done in the ToString() method like others suggested, but I don't think that is appropriate if you are going to use that for debugging only.

Twink answered 10/6, 2011 at 16:24 Comment(4)
I actually like this idea better than a roll-your-own ToString(). a JSON serialization will show every public field and its value in a much "lighter" format than XML, without touching ToString which may be used elsewhere. Here's a simple ToJSON extension method: weblogs.asp.net/scottgu/archive/2007/10/01/…Manse
a quick and dirty example would be useful here, especially since this might be needed the most by newcomers of the language!Bequeath
Newtonsoft's JsonConvert can has formatting options as well Debug.WriteLine(JsonConvert.SerializeObject(myObject, Formatting.Indented))Slumber
I use pretty printed objects in unit test assertions. It is a quick way ( cut'n'paste ) to assert that all fields are present and have a certain value. Huge speedup in unit test production.Kostman
A
134

If you use Json then I would suggest using Newtonsofts Json library and then you can output the entire object in Json notation and it will format it with spacing and line breaks. we have used this to display complex objects easily for debug purposes:

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

here I have also used the String Enum converter in order to display Enums as their string representation rather than as an integer.

The library is available through NuGet as Json.Net or Newtonsoft Json

Or you can get it here:

https://www.newtonsoft.com/json

Admass answered 10/6, 2011 at 16:36 Comment(1)
Great answer and the example works but calling the object to be serialized property is kinda misleading. Or maybe I'm missing something?Raceway
T
32

If it is just for debugging purposes, use the DebuggerDisplayAttribute.

Using this attribute will change what the object looks like in the Value section of the watch window (or ont he mouse-over during debugging)

usage:

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

}
Toothless answered 10/6, 2011 at 16:31 Comment(0)
T
25

Serialize it to JSON. It can be done in the ToString() method like others suggested, but I don't think that is appropriate if you are going to use that for debugging only.

Twink answered 10/6, 2011 at 16:24 Comment(4)
I actually like this idea better than a roll-your-own ToString(). a JSON serialization will show every public field and its value in a much "lighter" format than XML, without touching ToString which may be used elsewhere. Here's a simple ToJSON extension method: weblogs.asp.net/scottgu/archive/2007/10/01/…Manse
a quick and dirty example would be useful here, especially since this might be needed the most by newcomers of the language!Bequeath
Newtonsoft's JsonConvert can has formatting options as well Debug.WriteLine(JsonConvert.SerializeObject(myObject, Formatting.Indented))Slumber
I use pretty printed objects in unit test assertions. It is a quick way ( cut'n'paste ) to assert that all fields are present and have a certain value. Huge speedup in unit test production.Kostman
N
8

This worked very sweet for me:

string SerilizedText = "";
RootClass myclass= new Root RootClass ();
SerilizedText = JsonConvert.SerializeObject(myclass,Newtonsoft.Json.Formatting.Indented) ;
Nub answered 27/9, 2018 at 10:33 Comment(0)
J
6

An easy and simple way is to override the ToString method.

Here's a link: How to override ToString

Jared answered 10/6, 2011 at 16:23 Comment(0)
C
4

i also used Json for a while; but now I created a PrettyPrint-Minimod. You can add it via Nuget (it is a Sourcecode distribution). Find out what a Minimod is here.

It nicely prints object graphs and has some magic for enumerables and dictionaries. It also tries to figure out proper line-breaks.

I'll be blogging about it soon - but just go ahead and try it :-)

Coral answered 19/10, 2011 at 20:31 Comment(0)
U
3

Simply override ToString() on your type and provide your own, formatted string for debug display.

Ulceration answered 10/6, 2011 at 16:22 Comment(0)
M
2

I use this quite a bit to populate list boxes with custom objects:

public override string ToString()
{
    return String.Format("{0}:{1}:{2}", Property1, Property2, Property3);
}
Meissen answered 10/6, 2011 at 16:26 Comment(0)
W
2
  1. Install-Package ServiceStack.Text
  2. obj.Dump();

If you don't want to use external libs, write your own Dump() extension method.

Wimberly answered 22/12, 2014 at 19:23 Comment(1)
obj.ToDump() lets VS find the right package to help with your using includeCyndicyndia
B
0

Override the .ToString() method.

Bamford answered 10/6, 2011 at 16:22 Comment(1)
Avoid code only solutions. Explain with a link/description as the OP could be an inexperienced programmerViehmann

© 2022 - 2024 — McMap. All rights reserved.