c# - 如何使 DebuggerDisplay 适用于 Dictionary 中的复合类型?
问题描述
为了愉快地显示 aDictionary
的内容,我写了这个:
[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 -> DBG: 1
Bar -> DBG: 2
但相反,我看到了这个:
Foo -> {test.Thing}
Bar -> {test.Thing}
值得注意的是,如果我扩展KeyValuePair
s,我确实看到:
Name | Value
--------+-------
Key | "Foo"
Value | DBG: 1
所以DebuggerDisplay
确实有效。
那么问题是如何在字典内容的主监视列表中显示复合类型的内容?
解决方案
虽然嵌套评估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();
}
}
}
推荐阅读
- sql - 如何避免在 SQL 中多次计算相同的表达式
- node.js - 尝试从服务器发送简单数据以响应本机客户端
- python - 使用 Tensorflow 对象检测 API 为每个对象的所有类输出分数/概率
- migration - Migration: add a column after a specific column
- sql - SQL Auto-populate ID column based on another column
- c# - The imported project "\packages\Microsoft.Net.Compilers.3.3.1\tools\Microsoft.CSharp.Core.targets" was not found
- javascript - Will $timeout/setTimeout callback function executes before UI updates?
- python - 使用scrapy抓取无限滚动网站?
- javascript - reveal.js - 可以在特定幻灯片上重新绑定键吗?
- javascript - 人们如何绕过将 < 替换为 < 的简单 xss 过滤器