Может ли атрибут DebuggerDisplay быть применен к типам, которыми он не владеет?

Мне нравится DebuggerDisplay приписывать. Мне это так нравится, что я хочу использовать его для типов, для которых у меня нет исходного кода.

Это возможно?

3 ответа

Решение

Пример настройки DebuggerDisplay для стороннего типа (System.Collections.Generic.KeyValuePair) добавляет следующее в AssemblyInfo.cs:

using System.Collections.Generic;
using System.Diagnostics;

[assembly: DebuggerDisplay("[Key={Key}, Value={Value}]", Target = typeof(KeyValuePair<,>))]

(Проверено в VS2015)

Да. На самом деле, Microsoft была настолько хороша, что сделала это встроенной опцией в Visual Studio.

Посмотрите в "Мои документы \Visual Studio 20XX\autoexp.cs" несколько примеров того, как вы применяете атрибут DebuggerDisplay к типам, которые чужды вашей сборке. Затем добавьте свои собственные, перекомпилируйте их, замените autoexp.dll и перезапустите Visual Studio. Это должно просто работать.

Для справки см. Желтый пункт "Примечание" в этой статье MSDN.


В качестве альтернативы: я являюсь создателем приобретаемого расширения для Visual Studio, которое позволяет делать это намного проще, даже не требуя остановки сеанса отладки.

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

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

Другие вопросы по тегам