DebuggerDisplay разрешает строку во время выполнения

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

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

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

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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