gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 22:57:32 24 4
gpt4 key购买 nike

我正在使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com