我在LinqPad的NuGetVersion
包中使用NuGet.Versioning
。我正在尝试Dump()
来检查它的属性,但是我只是获取字符串表示而不是通常的转储。
例如,这个:
var v = new NuGetVersion("1.0.0");
v.Dump();
在输出窗口中显示以下内容:
1.0.0
有人知道LinqPad在转储某些类型时运行ToString()
的原因,以及如何更改此行为?
答案 0 :(得分:6)
通常,LINQPad调用ToString()
而不是在对象实现System.IFormattable
时扩展属性。
您可以通过在使用LINQPad ICustomMemberProvider的我的扩展中编写扩展方法来覆盖此问题:
编辑:现在有了更简单的方法。调用LINQPad的Util.ToExpando()
方法:
var v = new NuGetVersion("1.0.0");
Util.ToExpando (v).Dump();
(Util.ToExpando将对象转换为ExpandoObject。)
供参考,这是使用ICustomMemberProivder的旧解决方案:
static class MyExtensions
{
public static object ForceExpand<T> (this T value)
=> value == null ? null : new Expanded<T> (value);
class Expanded<T> : ICustomMemberProvider
{
object _instance;
PropertyInfo[] _props;
public Expanded (object instance)
{
_instance = instance;
_props = _instance.GetType().GetProperties();
}
public IEnumerable<string> GetNames() => _props.Select (p => p.Name);
public IEnumerable<Type> GetTypes () => _props.Select (p => p.PropertyType);
public IEnumerable<object> GetValues () => _props.Select (p => p.GetValue (_instance));
}
}
这样称呼:
new NuGetVersion("1.2.3.4").ForceExpand().Dump();