DebuggerDisplay для универсального класса - PullRequest
13 голосов
/ 03 ноября 2008

У меня проблема с применением атрибута DebuggerDisplay к универсальному классу:

[DebuggerDisplay("--foo--")]
class Foo
{
}

[DebuggerDisplay("Bar: {t}")]
class Bar<T>
{
    public T t;
}

При проверке объекта типа Bar<Foo> я ожидал бы, что он будет отображаться как Bar: --foo--, но я получу Bar: {Foo}

Что я делаю не так?

Ответы [ 3 ]

19 голосов
/ 03 ноября 2008

Атрибут DebuggerDisplay не является рекурсивным. {} Внутри строки, по сути, говорит, оцените это выражение и отобразите результат в строке. Строка для внутреннего результата вычисляется так, как если бы в игре не было атрибута DebuggerDisplay для типа или члена. Вот почему вы видите {Foo} вместо --foo--.

Причина этого - надежность. Слишком легко иметь взаимно рекурсивные теги атрибутов DebuggerDisplay. Это может вызвать переполнение стека или бесконечный цикл при оценке внутреннего выражения. Не рекурсивная оценка атрибута DebuggerDisplay предотвращает эту бесконечную рекурсию (хотя для пользователя все еще вполне возможно создать его внутри определенного выражения).

Одним из способов управления отображением внутреннего выражения является переопределение метода .ToString (). Это будет оценено при вычислении отображаемой строки для внутреннего выражения.

2 голосов
/ 08 октября 2015

[Отказ от ответственности: я связан с OzCode]

Вы можете использовать функцию OzCode Reveal, которая поддерживает вложенную / рекурсивную информацию отладки. enter image description here
Как только вы определите его для экземпляра, он будет автоматически использоваться для всех экземпляров этого типа.

1 голос
/ 16 сентября 2015

Вы можете использовать [DebuggerDisplay("Bar<{typeof(T).Name}>,nq}")]//nq - no quotes.

Вы также можете использовать эти практики: Рекомендации по использованию атрибутов DebuggerDisplay

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...