Как заставить DebuggerDisplay работать для составных типов в словаре? - PullRequest
0 голосов
/ 18 ноября 2018

В попытке приятно отобразить содержимое Dictionary, я написал это:

[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 работает.

Итак, проблема в том, как отобразить содержимое составного типа в основном списке просмотра содержимого словаря?

1 Ответ

0 голосов
/ 18 ноября 2018

Хотя вложенная оценка 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();
        }
    }
}
...