2012-08-28 9 views
6

TL; DR
Qualcuno sa come scrivere un Debug Visualizer per Visual Studio 2012, in C#, quindi mi può visualizzare IEnumerable<string>, string[] o simili oggetti?Visual Studio Visualizer per IEnumerable <string>

Ulteriori informazioni
Visual Studio Debug Visualizer sono grandi, e io uso alcuni tra quelli popolari (Mole) regolarmente. Tuttavia, ora è giunto il momento di implementare alcuni visualizzatori personalizzati. Ho iniziato con un semplice visualizzatore per una stringa:

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

il codice di DebuggerSide è fondamentalmente l'esempio dal modello:

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 è il modulo personalizzato con controlli aggiuntivi, ecc ... quando costruisco il progetto e inserisco la DLL nella cartella My Documents/Visual Studio 11/Visualizers e riavvia Visual Studio, posso effettivamente vedere il debugger apparire sotto l'icona di vetro quando si colpisce un punto di interruzione per un oggetto stringa. Woohoo! Fin qui tutto bene.

Ora mi piacerebbe, invece di visualizzare string, visualizzare string[] o IEnumerable<string> o un oggetto simile. Tuttavia, quando cambio l'attributo assembly su IEnumerable<string>, questo non funziona, non c'è nemmeno un'icona di vetro visualizzata sugli oggetti IEnumerable.

UPDATE
posso farlo funzionare cambiando il TargetType per List<> e poi controllando se posso lanciare a List<string>. Tuttavia, questo significa che devo lanciare tutti i miei oggetti che voglio eseguire il debug di List e non posso usare IEnumerable<> o string []

+0

+1 per Mole. Stavo cercando di scrivere un visualizzatore per le raccolte e vedo che ce l'ha già. Andando a provare Mole ora. ** Aggiornamento: ** La talpa non viene più venduta. Torna a scrivere un visualizzatore. –

+0

Dai uno scatto, funziona per tutti gli oggetti: https://github.com/amithegde/LpDump – Amit

risposta

1

Visualizer sono documentati come

Il supporto per i tipi generici è limitato. Puoi scrivere un visualizzatore per un target che è un tipo generico solo se il tipo generico è di tipo aperto.

Ciò significa che non è possibile scrivere un visualizzatore che utilizza un tipo chiuso come IEnumerable<string>. Hai provato a impostare il tipo di target su IEnumeraable<> quindi a verificare se gli elementi sono di tipo string?

+0

grazie, sto davvero utilizzando un approccio in cui controllo il contenuto dell'oggetto. – RoelF