Доработанный ObjectDumper от MS
in

Вызов:

ObjectDumper.Write(sKey, 2, Tex);

 

ObjectDumper от Microsoft пришлось подправить на предмет выдачи объектов специфического типа (например: System.Collection.BitArray)

public class ObjectDumper
{

public static void Write(object element)
{
Write(element, 0);
}

public static void Write(object element, int depth)
{
Write(element, depth, Console.Out);
}

public static void Write(object element, int depth, TextWriter log)
{
ObjectDumper dumper = new ObjectDumper(depth);
dumper.writer = log;
dumper.WriteObject(null, element);
}

TextWriter writer;
int pos;
int level;
int depth;

private ObjectDumper(int depth)
{
this.depth = depth;
}

private void Write(string s)
{
if (s != null)
{
writer.Write(s);
pos += s.Length;
}
}

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 element)
{
//        if (element == null || element is ValueType || element is string)
if (element == null || (element is ValueType && !(element is DictionaryEntry)) || element is string)              
{
WriteIndent();
Write(prefix);
WriteValue(element);
WriteLine();
}
else
{
IEnumerable enumerableElement = element as IEnumerable;
if (enumerableElement != null)
{
foreach (object item in enumerableElement)
{
if (item is IEnumerable && !(item is string))
{
WriteIndent();
Write(prefix);
Write("...");
WriteLine();
if (level < depth)
{
level++;
WriteObject(prefix, item);
level--;
}
}
else
{
WriteObject(prefix, item);
}
}
}
else
{
MemberInfo[] members = element.GetType().GetMembers(BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Static);
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((f!=null)?f.FieldType.Name: p.PropertyType.Name);
Write(" ");
Write(m.Name);
Write("=");
Type t = f != null ? f.FieldType : p.PropertyType;

if (t.IsValueType || t == typeof(string))
{
if (f != null)
WriteValue(f.GetValue(element));
else
{
int indexedCount = p.GetIndexParameters().Length;
//if not indexed property
if (indexedCount == 0)
WriteValue(p.GetValue(element, null));
else
{
Write("[");

for (int i = 0; i < indexedCount; i++)
{
if (i > 0)
{
Write(", ");
}
WriteValue(p.GetValue(element, new object[]{i}));
}
Write("]");
}
}
}
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)
{
object value;
Type t = f != null ? f.FieldType : p.PropertyType;
if (!(t.IsValueType || t == typeof(string)))
{
if (f != null)
{
value = f.GetValue(element);
if (value != null)
{
level++;
WriteObject(m.Name + ": ", value);
level--;
}
}
else
{
int indexedCount = p.GetIndexParameters().Length;
//if not indexed property
if (indexedCount == 0)
{
value = p.GetValue(element, null);
if (value != null)
{
level++;
WriteObject(m.Name + ": ", value);
level--;
}
}
else
{
Write("[");

for (int i = 0; i < indexedCount; i++)
{
if (i > 0)
{
Write(", ");
}
value = p.GetValue(element, new object[] { i });

if (value != null)
{
level++;
WriteObject(m.Name + ": ", value);
level--;
}
}
Write("]");
}
}

}
}
}
}
}
}
}

private void WriteValue(object o)
{
if (o == null)
{
Write("null");
}
else if (o is DateTime)
{
DateTime time = (DateTime)o;
Write(time.ToShortDateString());
if(time.Date != time)
{
Write(" ");
Write(time.ToLongTimeString());
}
}
else if (o is ValueType || o is string)
{
Write(o.ToString());
}
else if (o is IEnumerable)
{
Write("...");
}
else
{
Write("{ }");
}
}

}

0
Your rating: Нет

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступны HTML теги: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <p> <br><b><i> <img>
  • Строки и параграфы переносятся автоматически.

Подробнее о форматировании

КАПЧА
Этот тест необходим защиты от спама
6 + 14 =
Решите эту простую математическую задачу и введите результат. То есть для 1+3, введите 4.
To prevent automated spam submissions leave this field empty.