2008-10-21 11 views
7

¿Es posible iterar la recopilación y mostrar solo la información del objeto filtrado mientras se depura en Visual Studio? Usaría la ventana Inmediato para eso, pero a pesar de que permite ejecutar métodos en objetos, parece que no permite ejecutar enunciados de bucle personalizados.Iterar objeto enumerable al depurar en Visual Studio

ejemplo más simple en ASP.NET:

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

¿Cómo podemos iterar Page.Validators colección y encontrar los que son inválidos salida + su información en ese punto de ruptura? (esta no es la pregunta principal, es solo una muestra)

Si no es posible hacerlo de manera directa, ¿tiene alguna solución para esto? Soluciones alternativas que no implicarían la modificación del código, solo escribir código en la ventana Inmediato o alguna expresión de vigilancia.

Mientras que buscando en Google he encontrado sólo una solución temporal citado here (aunque no se pudo encontrar el original):

"Añadir un método de depuración de su código que hace algo como iterar a través de todos los objetos una colección. Entonces puede llamar a ese método de la ventana inmediata mientras que en el modo de depuración y enumerará varias cosas para usted. Piense en ello como un de línea de comandos-depurador-ayudante. puede escribir tantos de esos a tu gusto ".

Pero sigue siendo una solución. I imagen debería ser factible sin demasiada piratería y más importante aún sin modificar el código. Por supuesto, debería ser posible hacer algún tipo de transformaciones de colección en una declaración.

Y ceñidos a colecciones no genéricas. También la ventana Inmediato parece no aceptar expresiones lambda (se obtuvo un error cuando se intentó: "Expresión no puede contener expresiones lambda")

Respuesta

8

Puede intentar usar la ventana inmediata y una llamada LINQ-a-objetos.

ejemplo artificioso:

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

Actualización: Al parecer, esto no funcionará como ventana inmediata no permite lambdas. Sin embargo, si implementa el lambda como un método de depuración solo puede hacerlo.

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

Y a continuación, sólo hay que poner una llamada a Where en la ventana inmediata:

pages.Where(BreakPointPredicate); 
+0

muy útil, gracias Jeff. – Kon

+0

De nada. Me alegra que hayas encontrado esto útil. –

Cuestiones relacionadas