In PHP there is the var_dump() and print_r() function that displays the contents of an object.
Sometimes i miss this functionality in ASP.NET, especially when you are working with large objects and don't want to step into your code every time.
I came up with this method to list all the properties of a given object by name and value.
It also lists any child properties recursively, until it reaches a certain level of recursion (in this case it stops after 5 recursions).
using System;
using System.Text;
using System.Reflection;
using System.Collections;
public string var_dump(object obj, int recursion)
{
StringBuilder result = new StringBuilder();
// Protect the method against endless recursion
if (recursion < 5)
{
// Determine object type
Type t = obj.GetType();
// Get array with properties for this object
PropertyInfo[] properties = t.GetProperties();
foreach (PropertyInfo property in properties)
{
try
{
// Get the property value
object value = property.GetValue(obj, null);
// Create indenting string to put in front of properties of a deeper level
// We'll need this when we display the property name and value
string indent = String.Empty;
string spaces = "| ";
string trail = "|...";
if (recursion > 0)
{
indent = new StringBuilder(trail).Insert(0, spaces, recursion - 1).ToString();
}
if (value != null)
{
// If the value is a string, add quotation marks
string displayValue = value.ToString();
if (value is string) displayValue = String.Concat('"', displayValue, '"');
// Add property name and value to return string
result.AppendFormat("{0}{1} = {2}\n", indent, property.Name, displayValue);
try
{
if (!(value is ICollection))
{
// Call var_dump() again to list child properties
// This throws an exception if the current property value
// is of an unsupported type (eg. it has not properties)
result.Append(var_dump(value, recursion + 1));
}
else
{
// 2009-07-29: added support for collections
// The value is a collection (eg. it's an arraylist or generic list)
// so loop through its elements and dump their properties
int elementCount = 0;
foreach (object element in ((ICollection)value))
{
string elementName = String.Format("{0}[{1}]", property.Name, elementCount);
indent = new StringBuilder(trail).Insert(0, spaces, recursion).ToString();
// Display the collection element name and type
result.AppendFormat("{0}{1} = {2}\n", indent, elementName, element.ToString());
// Display the child properties
result.Append(var_dump(element, recursion + 2));
elementCount++;
}
result.Append(var_dump(value, recursion + 1));
}
}
catch { }
}
else
{
// Add empty (null) property to return string
result.AppendFormat("{0}{1} = {2}\n", indent, property.Name, "null");
}
}
catch
{
// Some properties will throw an exception on property.GetValue()
// I don't know exactly why this happens, so for now i will ignore them...
}
}
}
return result.ToString();
}
For my example i used an object called Category, but this can be an instance of any class.
Category has a few basic properties and one called Parent which holds another Category object (so we have child properties).
I call the method like this:
Category category = LoadCategory(123);
Response.Write(var_dump(myObject, 0)); // Always start at recursion 0,
// you might want to add an override
// that sets this argument by default
The output of this example is:
CategoryId = 685
ParentId = 287
Name = "Beans"
Description = ""
Parent = MyProject.Data.Category
|...CategoryId = 287
|...ParentId = 174
|...Name = "Cheap food"
|...Description = ""
|...Parent = MyProject.Data.Category
| |...CategoryId = 174
| |...ParentId = 173
| |...Name = "Food"
| |...Description = ""
| |...Parent = MyProject.Data.Category
| | |...CategoryId = 173
| | |...ParentId = 0
| | |...Name = "Things to eat"
| | |...Description = ""
| | |...Parent = null
| | |...Count = 0
| |...Count = 0
|...Count = 13
Count = 0
TestList = System.Collections.Generic.List`1[MyProject.Data.Category]
|...TestList[0] = MyProject.Data.Category
| |...CategoryId = 1
| |...ParentId = 0
| |...Name = "Bla"
| |...Description = ""
| |...Count = 0
|...Count = 1
It's not exactly PHP's var_dump() method, but it works for me! :)
I might expand it some day so it dumps array/list elements too and maybe add some XHTML formatting.
Update on 29-07-2009:
Added support for collection properties.
/Ruud