C# 如何使DebuggerDisplay在字典中为复合类型工作?
为了愉快地显示C# 如何使DebuggerDisplay在字典中为复合类型工作?,c#,visual-studio-debugging,debuggerdisplay,C#,Visual Studio Debugging,Debuggerdisplay,为了愉快地显示词典的内容,我写了以下内容: [assembly: DebuggerDisplay("{Key,nq} -> {Value,nq}", Target = typeof(KeyValuePair<,>))] namespace test { [DebuggerDisplay("{DebuggerDisplay,nq}")] public class Thing { private readonly int _num;
词典
的内容,我写了以下内容:
[assembly: DebuggerDisplay("{Key,nq} -> {Value,nq}", Target = typeof(KeyValuePair<,>))]
namespace test {
[DebuggerDisplay("{DebuggerDisplay,nq}")]
public class Thing {
private readonly int _num;
public string DebuggerDisplay => $"DBG: {_num}";
public Thing(int num) => _num = num;
}
public class Program {
static void Main(string[] args) {
var map = new Dictionary<string,Thing> {
["Foo"] = new Thing(1),
["Bar"] = new Thing(2),
};
}
}
}
但我看到的是:
Foo -> {test.Thing}
Bar -> {test.Thing}
值得注意的是,如果我在KeyValuePair
s的基础上展开,我确实看到:
Name | Value
--------+-------
Key | "Foo"
Value | DBG: 1
因此,DebuggerDisplay
确实有效
因此,问题在于如何在字典内容的主观察列表中显示复合类型的内容?尽管
调试程序显示的嵌套计算不起作用,但实际上它足够灵活,可以调用任何带有参数的自定义格式方法。所以我会这样做:
[assembly:DebuggerDisplay("{Key,nq} -> {MyNamespace.DebugHelper.DisplayValue(this.Value),nq}", Target = typeof(KeyValuePair<,>))]
虽然DebuggerDisplay
的嵌套计算不起作用,但它实际上足够灵活,可以使用参数调用任何自定义格式方法。所以我会这样做:
[assembly:DebuggerDisplay("{Key,nq} -> {MyNamespace.DebugHelper.DisplayValue(this.Value),nq}", Target = typeof(KeyValuePair<,>))]
internal static class DebugHelper
{
internal static string DisplayValue(object value)
{
switch (value)
{
case Thing thing:
return thing.DebuggerDisplay; // or even better just to format it here
default:
return value.ToString();
}
}
}