【发布时间】:2018-04-19 09:47:42
【问题描述】:
考虑这个MCVE 类:
public class Foo<T>
{
private readonly T value;
public Foo(T value)
{
this.value = value;
}
}
当我在 C# Interactive 中评估和打印这样一个对象时,它看起来像这样:
> new Foo<string>("bar")
Foo<string> { }
这没什么用。我希望它看起来像这样:
Foo<string> { "bar" }
我该怎么做?
我尝试过像这样覆盖ToString:
public override string ToString()
{
return $"Foo{typeof(T)} {{ {value} }}";
}
这并不完全符合我的要求:
> new Foo<string>("bar")
[Foo<System.String> { bar }]
此输出至少存在三个问题:
- 值不在引号中。我希望它是
"bar"而不是bar。 - 类型参数显示为
System.String,而不是string。 - 整个值用方括号括起来。这是我最不关心的问题。
有没有办法让 C# 交互式显示具有自定义格式的对象?
我知道我可以将公共属性添加到类中以显示值,但由于封装问题我不想这样做。不过,要清楚,这就是我的意思:
public class Foo<T>
{
public Foo(T value)
{
Value = value;
}
public T Value { get; }
}
打印出来的结果更接近我想要的:
> new Foo<string>("bar")
Foo<string> { Value="bar" }
但是,正如我所写,我不想添加公共属性。
如何让它表现如下?
> new Foo<string>("bar")
Foo<string> { "bar" }
> new Foo<int>(42)
Foo<int> { 42 }
请注意,当使用字符串以外的任何内容时(例如 int),不应使用引号。
【问题讨论】:
-
也许说的很明显,虽然我不知道如何回答这个问题,但一种途径是了解 C# 交互在评估对象时调用的内容。看起来它循环通过公共属性/成员(我猜是使用反射)并漂亮地打印出来,或者如果它在类中被覆盖,则调用 ToString 。也许它提供了一个钩子来用其他东西替换这个逻辑。我很快在文档中查找了类似的内容,但没有找到。
-
您是否尝试过添加
DebuggerDisplay属性? -
@khillang 我有,但显然有点太随意了。我认为这是正确的解决方案。如果您想添加答案,我很乐意接受。谢谢。
标签: c# .net c#-interactive