在Visual Studio中进行调试时,是否可以迭代集合并仅列出已过滤的对象信息?我会使用立即窗口,但是虽然它允许在对象上执行方法,但似乎不允许执行自定义循环语句。
ASP.NET中最简单的例子:
this.Page.Validate();
if (!this.Page.IsValid())
{
// breakpoint here
}
我们如何迭代Page.Validators
集合并找到那些无效的+在该断点输出其信息? (这不是主要问题,只是一个样本)
如果无法直接执行此操作,您是否有任何解决方法?解决方法不涉及代码修改,只需在立即窗口或某些Watch表达式中编写代码。
谷歌搜索时我发现只有一个解决方法引用here(虽然找不到原文):
“为您的代码添加调试方法 做了类似迭代的事情 集合中的所有对象。然后 你可以从中调用该方法 在调试模式下立即进入窗口 它将列举各种事物 为了你。把它想象成一个 命令行调试器辅助。您可以 写下你喜欢的那些。“
但它仍然是一种解决方法。我认为它应该是可行的,没有太多的黑客攻击,更重要的是没有修改代码。 当然,应该可以在一个语句中进行某种集合转换。
让我们坚持非泛型集合。 立即窗口似乎不接受lambda表达式(尝试时出错:“表达式不能包含lambda表达式”)
答案 0 :(得分:8)
您可以尝试使用立即窗口和LINQ到对象调用。
受挫的例子:
pages.Where((x) =>
{
if (x.IsValid)
{
Debugger.Break();
return true;
}
return false;
});
更新:显然,这不起作用,因为立即窗口不允许lambdas。但是,如果将lambda实现为仅调试方法,则可以执行此操作。
[Conditional("DEBUG")]
static bool BreakpointPredicate(YourItemType x)
{
if (x.IsValid)
{
Debugger.Break()
return true;
}
return false;
}
然后只需在即时窗口中调用Where
:
pages.Where(BreakPointPredicate);