2012-08-28 10 views
6

TL; DR
Wer weiß, wie eine Debug Visualizer für Visual Studio 2012, in C# zu schreiben, so kann ich IEnumerable<string>, string[] oder ähnliche Objekte visualisieren?Visual Studio Visualizer für IEnumerable <string>

Mehr Infos
Visual Studio Debug Visualizer sind groß, und ich benutze populäreren (Mole) regelmäßig. Jetzt ist es jedoch an der Zeit, einige benutzerdefinierte Visualizer zu erstellen. Ich begann mit einem einfachen Visualizer für eine Zeichenfolge aus:

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

der Code von DebuggerSide ist im Grunde das Beispiel aus der Vorlage:

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 ist das benutzerdefinierte Formular mit zusätzlichen Kontrollen etc ... Wenn ich das Projekt baue und die DLL in den Ordner My Documents/Visual Studio 11/Visualizers lege und Visual Studio neu starte, kann ich tatsächlich sehen, dass der Debugger unter dem Spiegelsymbol erscheint, wenn ein Haltepunkt für ein String-Objekt getroffen wird. Woohoo! So weit, ist es gut.

Jetzt möchte ich, statt string visualisieren string[] oder IEnumerable<string> oder ein ähnliches Objekt. Wenn ich jedoch das Assembly-Attribut auf IEnumerable<string> ändere, funktioniert dies nicht, es wird nicht einmal ein Spiegelglas-Symbol auf den IEnumerable-Objekten angezeigt.

UPDATE
Ich kann es durch eine Änderung der Target zu List<> an die Arbeit und die Überprüfung dann, wenn ich List<string> werfen kann. Das bedeutet aber, ich alle meine Objekte zu werfen habe ich zu List debuggen und nicht IEnumerable<> verwenden oder string []

+0

+1 für Mole. Ich habe versucht, einen Visualizer für Sammlungen zu schreiben, und ich sehe, dass es bereits vorhanden ist. Ich werde jetzt Mole probieren. ** Update: ** Mole wird nicht mehr verkauft. Zurück zum Schreiben eines Visualizers. –

+0

Geben Sie das eine Chance, funktioniert für alle Objekte: https://github.com/amithegde/LpDump – Amit

Antwort

1

Visualizer sind dokumentiert als

Unterstützung für generische Typen begrenzt ist. Sie können einen Visualizer nur dann für ein Ziel schreiben, wenn es sich bei dem generischen Typ um einen allgemeinen Typ handelt.

Das bedeutet, dass Sie keinen Visualizer schreiben können, der einen geschlossenen konstruierten Typ wie IEnumerable<string> verwendet. Haben Sie versucht, den Zieltyp auf IEnumeraable<> einzustellen und dann zu prüfen, ob die Elemente vom Typ string sind?

+0

danke, ich verwende tatsächlich einen Ansatz, wo ich den Inhalt des Objekts überprüfen. – RoelF

Verwandte Themen