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