2008-10-21 3 views
7

È possibile iterare la raccolta e elencare solo le informazioni sull'oggetto filtrate durante il debug in Visual Studio? Vorrei usare la finestra Immediata per questo, ma sebbene consenta di eseguire metodi sugli oggetti, sembra non consentire l'esecuzione di istruzioni di loop personalizzati.Iterare oggetto enumerabile durante il debug in Visual Studio

esempio più semplice in ASP.NET:

this.Page.Validate(); 
if (!this.Page.IsValid()) 
{ 
    // breakpoint here 
} 

Come possiamo iterare Page.Validators raccolta e trovare quelli che sono uscita + invalida le loro informazioni a quel punto di rottura? (questa non è la domanda principale, è solo un esempio)

Se non è possibile farlo in modo diretto, hai qualche soluzione alternativa per questo? Soluzioni alternative che non comportano la modifica del codice, solo la scrittura di codice nella finestra Immediata o alcune espressioni di Watch.

Mentre googling ho trovato solo una soluzione citata here (anche se non riusciva a trovare l'originale):

"Aggiungi un metodo di debug per il codice che fa qualcosa di simile Scorrere tutti gli oggetti in una collezione. Poi è possibile chiamare quel metodo dalla finestra immediata mentre in modalità debug e sarà enumerare le varie cose per voi. Pensate a come un della riga di comando-debugger-helper. puoi scrivere come molti di quelli che vuoi. "

Ma è ancora una soluzione. Immagino che dovrebbe essere fattibile senza troppi hacking e, soprattutto, senza modificare il codice. Ovviamente dovrebbe essere possibile eseguire una sorta di trasformazione della raccolta in un'unica istruzione.

E passiamo alle raccolte non generiche. Anche la finestra Immediata sembra non accettare le espressioni lambda (viene visualizzato un errore quando viene provato: "L'espressione non può contenere espressioni lambda")

risposta

8

Si potrebbe provare a utilizzare la finestra immediata e una chiamata LINQ-a-oggetto.

Escogitato esempio:

pages.Where((x) => 
{ 
    if (x.IsValid) 
    { 
     Debugger.Break(); 
     return true; 
    } 
    return false; 
}); 

Aggiornamento: A quanto pare, questo non funzionerà finestra immediata non consente lambda. Tuttavia, se si implementa il metodo lambda come metodo di debug, è possibile farlo.

[Conditional("DEBUG")] 
static bool BreakpointPredicate(YourItemType x) 
{ 
    if (x.IsValid) 
    { 
     Debugger.Break() 
     return true; 
    } 
    return false; 
} 

E poi basta mettere una chiamata al Where nella finestra immediata:

pages.Where(BreakPointPredicate); 
+0

Molto utile, grazie Jeff. – Kon

+0

Prego. Sono felice che tu l'abbia trovato utile. –