为什么 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();
我正在使用 LinqPad 中 NuGet.Versioning
包中的 NuGetVersion
。我试图 Dump()
它来检查它的属性,但我只是得到字符串表示而不是通常的转储。
例如,这个:
var v = new NuGetVersion("1.0.0");
v.Dump();
在输出中显示以下内容 window:
1.0.0
有谁知道为什么 LinqPad 在转储某些类型时运行 ToString()
,以及如何更改此行为?
一般来说,如果对象实现 System.IFormattable
.
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();