为什么LinqPad在转储某些类型时会运行ToString()?

时间:2016-06-16 13:56:59

标签: c# linqpad

我在LinqPad的NuGetVersion包中使用NuGet.Versioning。我正在尝试Dump()来检查它的属性,但是我只是获取字符串表示而不是通常的转储。

例如,这个:

var v = new NuGetVersion("1.0.0");
v.Dump();

在输出窗口中显示以下内容:

1.0.0

有人知道LinqPad在转储某些类型时运行ToString()的原因,以及如何更改此行为?

1 个答案:

答案 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();