LINQPad 支持为类型自定义 Dump。使用一些扩展方法,您可以将类型转换为ExpandoObjects,然后将它们与属性一起输出。
在我的扩展中,在MyExtensions 类之后,添加一个顶级方法:
static object ToDump(object obj) {
if (obj is XObject x)
return x.ToExpando();
else
return obj;
}
在MyExtensions 类中,添加以下扩展方法。我已经有 object->Dictionary 转换为匿名对象的方法,所以我使用了这些方法,但你可以将它们组合起来在 object 上创建一个 ToExpando:
public static ExpandoObject ToExpando(this object obj) => obj.ToDictionary().ToExpando();
public static IDictionary<string, object> ToDictionary(this object obj) {
if (obj is IDictionary<string, object> id)
return id;
else {
var dictAnsObj = new Dictionary<string, object>();
foreach (var prop in obj.GetType().GetPropertiesOrFields()) {
try {
dictAnsObj.Add(prop.Name, prop.GetValue(obj));
}
catch (Exception ex) {
dictAnsObj.Add(prop.Name, ex);
}
}
return dictAnsObj;
}
}
public static ExpandoObject ToExpando(this IDictionary<string, object> objDict) {
var e = new ExpandoObject();
var di = (IDictionary<string, object>)e;
foreach (var kvp in objDict)
di.Add(kvp);
return e;
}
您还需要这个Type 扩展:
// ***
// *** Type Extensions
// ***
public static List<MemberInfo> GetPropertiesOrFields(this Type t, BindingFlags bf = BindingFlags.Public | BindingFlags.Instance) =>
t.GetMembers(bf).Where(mi => mi.MemberType == MemberTypes.Field | mi.MemberType == MemberTypes.Property).ToList();
如果您可以仅以类格式显示顶级对象,则可以在需要时使用此扩展方法:
public static T DumpAs<T, NewT>(this T obj, Func<T, NewT> castFn, string description = null) {
if (description != null)
castFn(obj).Dump(description);
else
castFn(obj).Dump();
return obj;
}
例如,
XElement xn;
xn.DumpAs(x => x.ToExpando());
否则,您将不得不注释掉 ToDump 方法或使用流利的方法做一些棘手的事情来打开和关闭它。