Форматирование стороннего объекта .NET в отладчике - PullRequest
3 голосов
/ 02 марта 2012

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

[0] {System.Collections.Specialized.NameObjectCollectionBase.NameObjectEntry}
[1] {System.Collections.Specialized.NameObjectCollectionBase.NameObjectEntry}
...
[191] {System.Collections.Specialized.NameObjectCollectionBase.NameObjectEntry}
[192] {System.Collections.Specialized.NameObjectCollectionBase.NameObjectEntry}

Мне интересно, есть ли способ сообщить отладчику, как форматировать NameObjectEntry, чтобы показать мне данные внутри экземпляра, а не имя типа. Что-то вроде:

[0] {"key1","value1"}
[1] {"key2","value2"}
...
[191] {"key191","value191"}
[192] {"key192","value192"}

С моими собственными классами я мог бы либо переопределить ToString(), либо использовать атрибут DebuggerDisplay, но NameObjectEntry является частью .NET Framework, я не могу его изменить. К сожалению, результаты поиска в основном рекомендуют один из этих двух.

Могу ли я что-нибудь сделать, чтобы отладчик показывал этот объект определенным образом?

Редактировать : для будущих читателей было решено использовать файл autoexp.cs, поставляемый с VS, как описано здесь:

http://msdn.microsoft.com/en-us/library/x810d419%28VS.90%29.aspx

1 Ответ

2 голосов
/ 02 марта 2012

Да, вы можете использовать атрибут DebuggerDisplay.Это легко, когда у вас есть доступ к исходному коду класса.Проверьте эту ссылку для получения дополнительной информации: http://msdn.microsoft.com/en-us/library/ms228992.aspx.

Если у вас нет доступа к исходному коду, вы можете попробовать сделать следующее:

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

Итак, допустим, у вас есть внешний класс с именем SampleExternalClass

В вашем собственном коде вы должны создатьпроизводный класс:

[DebuggerDisplay("custom formatted object with string = { StringPropertyNameFromBaseClass } ")]
class SampleInternalClass : SampleExternalClass
{
    //you don't have to put anything in here
}

После этих шагов, когда вы используете в отладчике объект вида типа SampleInternalClass, он должен быть отформатирован так, как указано в атрибуте.

Это выглядитработают, когда оба класса находятся в одной и той же dll, но я полагаю, что это должно работать и в случае отдельных dll.

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