c# - 为什么 LinqPad 在转储时对某些类型运行 ToString()?

标签 c# linqpad

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

例如,这个:

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

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

1.0.0

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

最佳答案

一般来说,如果对象实现了 System.IFormattable,LINQPad 会调用 ToString() 而不是扩展属性。

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

关于c# - 为什么 LinqPad 在转储时对某些类型运行 ToString()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37861366/

相关文章:

c# - 从继承类中覆盖虚方法但保留基类的注释

c# - 使用 C# 在 AutoCAD 2015 中环绕相机

c# - 如何在 C#/ASP.NET MVC 中动态生成此 XML 页面?

reflection - 我可以替换Linqpad使用的反射工具吗?

c# - Linqpad 6 (Core) 和.Net Core Api?

c# - 在 OAuth 2.0 中存储 token 的责任

c# - 如何为 ASP.NET MVC 2 创建自定义成员资格提供程序?

.net - 即使添加引用后也找不到 LinqPad Linq Include() 扩展方法

linqpad - 有没有办法为 LINQPad 应用程序获取 IWin32Window?

build-automation - LINQPad - 可以从命令行运行 linqpad 脚本吗?