【问题标题】:Why does LinqPad run ToString() on some types when they are dumped?为什么 LinqPad 在转储某些类型时会在某些类型上运行 ToString()?
【发布时间】:2016-06-16 13:56:58
【问题描述】:

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

例如,这个:

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

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

1.0.0

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

【问题讨论】:

标签: c# linqpad


【解决方案1】:

一般来说,如果对象实现了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();

【讨论】:

  • 谢谢乔。你会考虑添加一个重载来做到这一点吗? v.Dump(forceExpand: true); 之类的东西?
  • 与 Dump 重载类似的 ForceExpand() 方法的优势在于它可以在单个属性上指定。
  • 请注意,ICustomMemberProvider 不再记录在该链接中。
猜你喜欢
  • 1970-01-01
  • 2016-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多