在Visual Studio中进行调试时,是否可以迭代集合并仅列出过滤的对象信息?我会使用立即窗口,虽然它允许在对象上执行方法,但似乎不允许执行自定义循环语句.
ASP.NET中最简单的例子:
this.Page.Validate(); if (!this.Page.IsValid()) { // breakpoint here }
我们如何迭代Page.Validators
收集并找到那些无效的+在该断点处输出它们的信息?(这不是主要问题,只是一个样本)
如果不能直接做到这一点,你有解决办法吗?不涉及代码修改的解决方法,只需在立即窗口或某些Watch表达式中编写代码.
谷歌搜索我发现这里只引用了一个解决方法(虽然找不到原文):
"在你的代码中添加一个调试方法,它可以像迭代集合中的所有对象一样.然后你可以在调试模式下从即时窗口调用该方法,它会为你枚举各种各样的东西.把它想象成一个命令-line-debugger-helper.您可以根据需要编写尽可能多的内容."
但它仍然是一种解决方法.我认为它应该是可行的,没有太多的黑客攻击,更重要的是没有修改代码.当然,应该可以在一个语句中进行某种集合转换.
让我们坚持非泛型集合.立即窗口似乎不接受lambda表达式(尝试时出错:"表达式不能包含lambda表达式")
您可以尝试使用立即窗口和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);