bjectDumper re-loaded
You can output the content of every object using the following syntax:
ObjectDumper.Write (object you want to output);
class Program {static void Main(string[] args)
{ IList list = new ArrayList(); list.Add("Test"); list.Add("csharp");ObjectDumper.Write(list);
}
}
public class ObjectDumper {
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);Console.Write(dumper.ToString());
}
private StringBuilder builder = new StringBuilder();
int pos; int level; int depth;public override string ToString()
{ return builder.ToString();}
private ObjectDumper(int depth) {
this.depth = depth;}
private void Write(string s) {
if (s != null) {
builder.Append(s);
pos += s.Length;
}
}
private void WriteIndent() {
builder.Append(' ', level * 3);}
private void WriteLine() {
builder.AppendLine();
pos = 0;
}
private void WriteTab() {
Write("\t");}
private void WriteObject(string prefix, object o) {
if (o == null || o is ValueType || o is string) {
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);
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());
}
else if (o is ValueType || o is string) {
Write(o.ToString());
}
else if (o is IEnumerable) {
Write("…");}
else { Write("{ }");}
}
}
posted on 2007-10-17 16:58 Csharp Feeds 阅读(270) 评论(1) 收藏 举报
浙公网安备 33010602011771号