DebuggerDisplay разрешает строку во время выполнения - PullRequest
14 голосов
/ 15 апреля 2011

Есть ли способ получить доступ к строке, показанной DebuggerDisplayAttribute во время выполнения?

Для наших бизнес-объектов я пытаюсь получить информацию автоматического отладчика об обработке исключений.фактический объект, который использовался при обнаружении исключения, должен быть сериализован в текст для улучшения сообщения об исключении.Так как некоторые атрибуты имеют другие бизнес-объекты типа, это может быть очень длинным, если использовать рекурсивно.Поэтому я хотел бы сериализовать только ту информацию, которая уже определена в DebuggerDisplay атрибутах класса.Реализация классов ToString() может отличаться и не может использоваться для этой задачи.

Так возможно ли получить строку, отображаемую в отладчике во время выполнения?

Ответы [ 3 ]

5 голосов
/ 15 апреля 2011

Я так не думаю (по крайней мере, без каких-либо усилий с вашей стороны) - я только что немного покопался и нашел эту статью о рекомендациях по отображению отладчика.Он не имеет прямого отношения, но он подчеркивает одну вещь:

Каждое свойство {дыра в выражении} должно оцениваться индивидуально и выполняться один раз для каждого экземпляра этого типа в каждом окне отображения отладчика.

Я ожидаю, что он использует отладчик для оценки после того, как код был взломан (что-то вроде того, как вы использовали бы непосредственное окно для оценки оператора, когда вы находитесь в точке останова).

Суть в том, что итоговое отображаемое значение отладчика для объекта недоступно во время выполнения, если только вы не захотите проанализировать каждое из отверстий выражения и использовать отражение, чтобы оценить их самостоятельно.

В статье предлагается, что наиболее эффективный способ предоставления вывода отладчика - это использование закрытого метода для String.Format для всех свойств, которые вы хотите отобразить.Возможно, вы захотите сделать этот метод публичным (возможно, на интерфейсе) и использовать его для получения информации об исключении.

2 голосов
/ 15 апреля 2011

Возможно, есть какой-то способ извлечь эту информацию, но не будет ли проще переопределить эти классы с помощью свойства, подобного следующему:

[DebuggerDisplay("{InfoProperty}")]
class X {
    public string InfoProperty {
        get { return "Debug and display info here"; }
    }
}

Затем вы включите это InfoProperty в свои сообщения об ошибках./ log вместо того, чтобы копать способ восстановления данных для отображения в Visual Studio.

Конечно, я предполагаю, что вы можете изменять классы бизнес-объектов, что может быть не так ...

0 голосов
/ 15 апреля 2011

Технически, конечно, это возможно - вы могли бы получить доступ к DebuggerDisplayAttribute во время выполнения с помощью Reflection и написать некоторый код, который анализирует строку и снова использует Reflection для получения значений.Это не сработает, если у вас есть что-то, кроме свойств и полей внутри этих фигурных скобок.

В любом случае, я настоятельно советую вам прислушаться к совету Майка или Паоло - если вам нужны сотни классовизменить, а затем найти способ изменить их автоматически - либо с помощью чего-то вроде Структурного поиска и замены Решарпера, либо с помощью регулярного выражения - это не должно занять слишком много времени.

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