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 阅读(257) 评论(1) 编辑 收藏 举报