Object Dumper
using System; using System.IO; using System.Collections; using System.Collections.Generic; using System.Reflection; using System.Xml.Linq; namespace Lucene.Linq.Utility { public class ObjectDumper { const ConsoleColor CIdent = ConsoleColor.Cyan; const ConsoleColor CValue = ConsoleColor.Magenta; public static void Write(object o) { Write(o, 0); } public static void Write(object o, int depth) { ObjectDumper dumper = new ObjectDumper(depth); dumper.WriteObject(null, o); } TextWriter _writer; int _pos; int _level; int _depth; private ObjectDumper(int depth) { this._writer = Console.Out; this._depth = depth; } private void Write(string s) { if (s != null) { _writer.Write(s); _pos += s.Length; } } private void Write(string s, ConsoleColor c) { ConsoleColor temp = Console.ForegroundColor; Console.ForegroundColor = c; Write(s); Console.ForegroundColor = temp; } private void WriteIndent() { for (int i = 0; i < _level; i++) _writer.Write(" "); } private void WriteLine() { _writer.WriteLine(); _pos = 0; } private void WriteTab() { Write(" "); while (_pos % 8 != 0) Write(" "); } private void WriteObject(string prefix, object o) { if (o == null || o is ValueType || o is string || o is XElement) { WriteIndent(); Write(prefix); WriteValue(o); WriteLine(); } else if (o is IEnumerable) { foreach (object element in (IEnumerable)o) { if (element is IEnumerable && !(element is string)) { WriteIndent(); Write(prefix); Write("..."); WriteLine(); if (_level < _depth) { _level++; WriteObject(prefix, element); _level--; } } else { WriteObject(prefix, element); } } } else { MemberInfo[] members = o.GetType().GetMembers(BindingFlags.Public | BindingFlags.Instance); WriteIndent(); Write(prefix); bool propWritten = false; foreach (MemberInfo m in members) { FieldInfo f = m as FieldInfo; PropertyInfo p = m as PropertyInfo; if (f != null || p != null) { if (propWritten) { WriteTab(); } else { propWritten = true; } Write(m.Name, CIdent); Write("="); Type t = f != null ? f.FieldType : p.PropertyType; if (t.IsValueType || t == typeof(string)) { WriteValue(f != null ? f.GetValue(o) : p.GetValue(o, null)); } else { if (typeof(IEnumerable).IsAssignableFrom(t)) { Write("..."); } else { Write("{ }"); } } } } if (propWritten) WriteLine(); if (_level < _depth) { foreach (MemberInfo m in members) { FieldInfo f = m as FieldInfo; PropertyInfo p = m as PropertyInfo; if (f != null || p != null) { Type t = f != null ? f.FieldType : p.PropertyType; if (!(t.IsValueType || t == typeof(string))) { object value = f != null ? f.GetValue(o) : p.GetValue(o, null); if (value != null) { _level++; WriteObject(m.Name + ": ", value); _level--; } } } } } } } private void WriteValue(object o) { if (o == null) { Write("null"); } else if (o is DateTime) { Write(((DateTime)o).ToShortDateString(), CValue); } else if (o is ValueType || o is string || o is XElement) { Write(o.ToString(), CValue); } else if (o is IEnumerable) { Write("..."); } else { Write("{ }"); } } } }