2012-08-28 5 views
6

TL; DR
Czy ktoś wie jak napisać Debug Visualizer dla Visual Studio 2012, C#, więc mogę wyobrazić IEnumerable<string>, string[] lub podobnych obiektów?Visual Studio Visualizer dla IEnumerable <string>

Więcej informacji
Visual Studio Debug Visualizer są świetne, i używam kilka popularnych (Mole) regularnie. Jednak teraz nadszedł czas na wdrożenie niestandardowych wizualizatorów. Zacząłem z prostym wizualizera na sznurku:

[assembly: System.Diagnostics.DebuggerVisualizer(typeof(My.Namespace.DebuggerSide), 
              typeof(VisualizerObjectSource), 
              Target = typeof(string), 
              Description = "Awesome Visualizer")] 

kod DebuggerSide jest w zasadzie taki przykład z szablonu:

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 jest formą zwyczaj z dodatkowych kontroli itp ... kiedy buduję projekt i umieszczam bibliotekę dll w folderze My Documents/Visual Studio 11/Visualizers i ponownie uruchamiam studio graficzne, rzeczywiście widzę debugger pojawiający się pod ikoną szklanej tafli, gdy zostanie uderzony punkt przerwania dla obiektu typu string. Woohoo! Jak na razie dobrze.

Teraz chciałbym, zamiast wizualizować string, wizualizować string[] lub IEnumerable<string> lub podobny obiekt. Jednak po zmianie atrybutu złożenia na IEnumerable<string>, to nie działa, nie ma nawet ikony wyglądającej szkła wyświetlanej na obiektach IEnumerable.

UPDATE
mogę zmusić go do pracy przez zmianę TargetType do List<> a następnie sprawdzenie, czy mogę rzucić do List<string>. Oznacza to jednak, muszę oddać wszystkie moje przedmioty chcę debugowania do List i nie może korzystać IEnumerable<> lub string []

+0

+1 dla kreta. Próbowałem napisać wizualizator do kolekcji i widzę, że już to ma. Pójdę teraz wypróbować Mole. ** Aktualizacja: ** Mole nie jest już sprzedawany. Powrót do pisania wizualizatora. –

+0

Daj temu szansę, działa dla wszystkich obiektów: https://github.com/amithegde/LpDump – Amit

Odpowiedz

1

wizualizacje są udokumentowane jako

Wsparcie dla typów generycznych jest ograniczona. Możesz napisać wizualizator dla celu, który jest typem ogólnym, tylko jeśli typ ogólny jest typem otwartym.

Co oznacza, że ​​nie można napisać wizualizatora, który używa typu zamkniętego, takiego jak IEnumerable<string>. Czy próbowałeś ustawić typ celu na IEnumeraable<>, a następnie sprawdzając, czy elementy są typu string?

+0

dzięki, rzeczywiście używam podejścia, w którym sprawdzam zawartość obiektu. – RoelF

Powiązane problemy