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

Why does LinqPad run ToString() on some types when they are dumped?

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

例如,这个:

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

在输出中显示以下内容 window:

1.0.0

有谁知道为什么 LinqPad 在转储某些类型时运行 ToString(),以及如何更改此行为?

一般来说,如果对象实现 System.IFormattable.

,LINQPad 会调用 ToString() 而不是扩展属性

您可以通过在 My Extensions 中编写一个使用 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();