using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
public static class ObjectDumper
{
public static string Dump(object obj, int level = 3) => DictionaryToString(ToDictionary(obj, level));
private static bool IsObject(object o) => o != null && Type.GetTypeCode(o.GetType()) == TypeCode.Object;
private static bool IsNumeric(Type type)
{
if (type.IsEnum)
return false;
switch (Type.GetTypeCode(type))
{
case TypeCode.Byte:
case TypeCode.SByte:
case TypeCode.UInt16:
case TypeCode.UInt32:
case TypeCode.UInt64:
case TypeCode.Int16:
case TypeCode.Int32:
case TypeCode.Int64:
case TypeCode.Decimal:
case TypeCode.Double:
case TypeCode.Single:
return true;
case TypeCode.Object:
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))
{
return IsNumeric(Nullable.GetUnderlyingType(type));
}
return false;
default:
return false;
}
}
private static string Repeat(string value, int count) => new StringBuilder(value.Length * count).Insert(0, value, count).ToString();
private static IDictionary<string, object> ToDictionary(object source, int level = 3)
{
if (source == null) return null;
var dictionary = new Dictionary<string, object>();
foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(source))
AddPropertyToDictionary(property, source, dictionary, level);
return dictionary;
}
private static void AddPropertyToDictionary(PropertyDescriptor property, object source, Dictionary<string, object> dictionary, int level)
{
object value = null;
try
{
value = property.GetValue(source);
}
catch
{
// ignore
}
if (value == null)
{
dictionary.Add(property.Name, null);
return;
}
if (IsObject(value) && level > 0)
{
dictionary.Add(property.Name, ToDictionary(value, level - 1));
return;
}
dictionary.Add(property.Name, value);
}
private static string DictionaryToString(IDictionary<string, object> dictionary, int level = 0)
{
var sb = new StringBuilder();
sb.AppendLine("{");
var keys = dictionary.Keys.ToList();
keys.Sort();
var prefix = Repeat(" ", level);
foreach (var key in keys)
{
var value = dictionary[key];
if (value == null)
{
sb.AppendLine($"{prefix}{key}: {value}");
continue;
}
if (value is IDictionary<string, object> d)
{
sb.AppendLine($"{prefix}{key}: " + DictionaryToString(d, level + 1));
continue;
}
if (IsNumeric(value.GetType()))
sb.AppendLine($"{prefix}{key}: {value}");
else
sb.AppendLine($"{prefix}{key}: \"{value}\"");
}
sb.Append($"{prefix}" + "}");
return sb.ToString();
}
}
414200cookie-checkC# object dumper