在Visual Studio中调试时迭代可枚举对象

时间:2008-10-21 15:40:51

标签: visual-studio debugging

在Visual Studio中进行调试时,是否可以迭代集合并仅列出已过滤的对象信息?我会使用立即窗口,但是虽然它允许在对象上执行方法,但似乎不允许执行自定义循环语句。

ASP.NET中最简单的例子:

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

我们如何迭代Page.Validators集合并找到那些无效的+在该断点输出其信息? (这不是主要问题,只是一个样本)

如果无法直接执行此操作,您是否有任何解决方法?解决方法不涉及代码修改,只需在立即窗口或某些Watch表达式中编写代码。

谷歌搜索时我发现只有一个解决方法引用here(虽然找不到原文):

  

“为您的代码添加调试方法   做了类似迭代的事情   集合中的所有对象。然后   你可以从中调用该方法   在调试模式下立即进入窗口   它将列举各种事物   为了你。把它想象成一个   命令行调试器辅助。您可以   写下你喜欢的那些。“

但它仍然是一种解决方法。我认为它应该是可行的,没有太多的黑客攻击,更重要的是没有修改代码。 当然,应该可以在一个语句中进行某种集合转换。

让我们坚持非泛型集合。 立即窗口似乎不接受lambda表达式(尝试时出错:“表达式不能包含lambda表达式”)

1 个答案:

答案 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);