Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

A way to pretty print a C# object

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?

like image 271
Hui Avatar asked Jun 10 '11 16:06

Hui


People also ask

What is pretty print in C?

Prettyprint can be done in many different ways. One of the basic implementations is code formatting, which splits blocks of code into individual code lines. Certain tools do this for various programming languages like LISP or C, making the result much more readable and conventional.

What is pretty print format?

Prettyprint is the process of converting and presenting source code or other objects in a legible and attractive way. A prettyprinter takes blocks of code and prints them in an aesthetically pleasing fashion, presenting the characters with line breaks and indentations to make the code comprehensible.


9 Answers

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

like image 141
Richard Avatar answered Oct 01 '22 13:10

Richard


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

}
like image 26
vt100 Avatar answered Oct 01 '22 13:10

vt100


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.

like image 31
Ilia G Avatar answered Oct 01 '22 12:10

Ilia G


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

Here's a link: How to override ToString

like image 22
Gustavo Mori Avatar answered Oct 01 '22 13:10

Gustavo Mori


This worked very sweet for me:

string SerilizedText = "";
RootClass myclass= new Root RootClass ();
SerilizedText = JsonConvert.SerializeObject(myclass,Newtonsoft.Json.Formatting.Indented) ;
like image 33
maria Avatar answered Oct 01 '22 13:10

maria


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 :-)

like image 43
Lars Corneliussen Avatar answered Oct 01 '22 13:10

Lars Corneliussen


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

like image 29
Ed S. Avatar answered Oct 01 '22 12:10

Ed S.


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);
}
like image 27
Jon Avatar answered Oct 01 '22 14:10

Jon


  1. Install-Package ServiceStack.Text
  2. obj.Dump();

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

like image 2
Lessneek Avatar answered Oct 01 '22 13:10

Lessneek