2008-10-21 55 views
7

在Visual Studio中調試時,是否可以迭代收集並僅列出過濾對象信息?我會使用立即窗口,但雖然它允許在對象上執行方法,但似乎不允許執行自定義循環語句。在Visual Studio中調試時迭代可枚舉對象

在ASP.NET最簡單的例子:

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

我們如何可以遍歷Page.Validators收集和發現那些無效+輸出在該斷點他們的信息? (這不是主要問題,它只是一個示例)

如果不可能直接做到這一點,您是否有任何解決方法?不涉及代碼修改的變通方法,只需在即時窗口或某個Watch表達式中編寫代碼即可。

在谷歌上搜索,我發現只有一個解決辦法引述here(雖然找不到原):

「添加調試方法,您的代碼 不會像迭代通過 所有對象一個集合,然後 ,你甚至可以從 立即窗口方法,而在調試模式 ,它會枚舉各種事情 你。你可以把它像一個 命令行調試器輔助,你可以 寫儘可能多那些你喜歡的。「

但它仍然是一種解決方法。我認爲它應該是可行的,沒有太多的黑客攻擊,更重要的是無需修改代碼。 當然,應該可以在一個語句中進行某種集合轉換。

讓我們堅持非泛型集合。 也即時窗口似乎不接受lambda表達式(嘗試時出現錯誤:「表達式不能包含lambda表達式」)

回答

8

您可以嘗試使用立即窗口和LINQ到對象的調用。

人爲的例子:

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

更新:顯然,這將無法正常工作,立即窗口不允許lambda表達式。但是,如果將lambda實現爲僅調試方法,則可以執行此操作。

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

然後只是把呼叫Where在即時窗口:

pages.Where(BreakPointPredicate); 
+0

非常有幫助,感謝傑夫。 – Kon 2009-06-17 15:14:26