2008-10-21 9 views
7

Czy jest możliwe iterowanie kolekcji i wyświetlanie tylko filtrowanych informacji o obiektach podczas debugowania w programie Visual Studio? Używałbym do tego natychmiastowego okna, ale chociaż pozwala na wykonywanie metod na obiektach, wydaje się, że nie pozwala na wykonywanie instrukcji pętli niestandardowych.Powtórz przeliczanie obiektów podczas debugowania w programie Visual Studio

Najprostszy przykład w ASP.NET:

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

Jak możemy iteracyjne Page.Validators kolekcji i znaleźć te, które są wyprowadzane nieważny + ich informacje w tym przerwania? (to nie jest główne pytanie, to tylko próbka)

Jeśli nie można tego zrobić prosto, czy masz jakieś obejścia tego problemu? Obejścia, które nie wymagają modyfikacji kodu, po prostu wpisanie kodu w oknie bezpośrednim lub w wyrażeniu czasu oglądania.

Podczas googlowania znalazłem tylko jedno obejście cytowany here (choć nie mógł znaleźć oryginalny):

„Dodaj metodę debugowania do kodu, który robi coś takiego iterację wszystkich obiektów zbiór. Wtedy można wywołać tę metodę z bezpośrednim oknie w trybie debugowania i będzie wyliczać różne rzeczy dla Ciebie. Pomyśl o tym jak komenda-line-debugger-pomocnika. można napisać jak najwięcej z tych, które lubisz. "

Ale nadal jest to obejście problemu. Myślę, że powinno to być wykonalne bez zbytniego hackowania, a co ważniejsze bez modyfikowania kodu. Oczywiście powinno być możliwe wykonanie transformacji kolekcji w jednym komunikacie.

I trzymajmy się nietypowych kolekcji. Również okno Natychmiastowe wydaje się nie akceptować wyrażeń lambda (podczas próby wystąpił błąd: "Wyrażenie nie może zawierać wyrażeń lambda")

Odpowiedz

8

Możesz spróbować użyć bezpośredniego okna i wywołania LINQ do obiektu.

wymyślony przykład:

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

Aktualizacja: Najwyraźniej, to nie będzie działać jako natychmiastowe okno nie pozwala lambdy. Jeśli jednak zaimplementujesz lambdę jako metodę debugowania, możesz to zrobić.

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

A potem wystarczy umieścić wywołanie Where w najbliższym oknie:

pages.Where(BreakPointPredicate); 
+0

bardzo pomocny, dzięki Jeffa. – Kon

+0

Nie ma za co. Cieszę się, że okazało się to pomocne. –

Powiązane problemy