Visual Studio Visualizer для IEnumerable<строка>
TL;DR
Кто-нибудь знает, как написать Debug Visualizer для Visual Studio 2012 в C#, чтобы я мог визуализировать IEnumerable<string>
, string[]
или похожие объекты?
Больше информации
Visual Studio Debug Visualizer великолепны, и я регулярно использую некоторые популярные ( Mole). Однако сейчас пришло время развернуть несколько пользовательских визуализаторов. Я начал с простого визуализатора для строки:
[assembly: System.Diagnostics.DebuggerVisualizer(typeof(My.Namespace.DebuggerSide),
typeof(VisualizerObjectSource),
Target = typeof(string),
Description = "Awesome Visualizer")]
код DebuggerSide в основном пример из шаблона:
public class DebuggerSide : DialogDebuggerVisualizer
{
protected override void Show(IDialogVisualizerService windowService, IVisualizerObjectProvider objectProvider)
{
if (windowService == null)
throw new ArgumentNullException("windowService");
if (objectProvider == null)
throw new ArgumentNullException("objectProvider");
var data = (string)objectProvider.GetObject();
using (var displayForm = new VisualizerForm(data))
{
windowService.ShowDialog(displayForm);
}
}
/// <summary>
/// Tests the visualizer by hosting it outside of the debugger.
/// </summary>
/// <param name="objectToVisualize">The object to display in the visualizer.</param>
public static void TestShowVisualizer(object objectToVisualize)
{
VisualizerDevelopmentHost visualizerHost = new VisualizerDevelopmentHost(objectToVisualize, typeof(DebuggerSide));
visualizerHost.ShowVisualizer();
}
}
VisualizerForm
это пользовательская форма с дополнительными элементами управления и т.д... когда я собираю проект и помещаю dll в My Documents/Visual Studio 11/Visualizers
папку и перезапустите Visual Studio, я действительно вижу отладчик, появляющийся под значком зеркала при достижении точки останова для строкового объекта. Woohoo! Все идет нормально.
Теперь я хотел бы вместо того, чтобы визуализировать string
визуализировать string[]
или же IEnumerable<string>
или подобный объект. Однако, когда я изменяю атрибут сборки на IEnumerable<string>
, это не работает, на объектах IEnumerable не отображается даже значок зазеркалье.
ОБНОВИТЬ
Я могу заставить его работать, изменив TargetType на List<>
а затем проверить, могу ли я бросить List<string>
, Тем не менее, это означает, что я должен разыграть все свои объекты, которые я хочу отладить List
и не может использовать IEnumerable<>
или строка []
2 ответа
Визуализаторы документируются как
Поддержка универсальных типов ограничена. Вы можете написать визуализатор для цели, которая является универсальным типом, только если универсальный тип является открытым типом.
Это означает, что вы не можете написать визуализатор, который использует закрытый составной тип, такой как IEnumerable<string>
, Вы пытались установить тип цели на IEnumeraable<>
затем проверка, чтобы увидеть, если элементы имеют тип string
?
Смотрите раздел "Объекты, которые могут иметь визуализаторы отладчика" здесь: https://rapiddevbookcode.codeplex.com/wikipage?title=EnumerableDebugVisualizer
Мой Enumerable Debugger Visualizer будет работать с IEnumerable, если базовый конкретный тип зарегистрирован в нем, вы можете посмотреть регистрационный код, чтобы заставить ваш работать.