当前位置:  开发笔记 > 后端 > 正文

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

如何解决《在VisualStudio中调试时迭代可枚举对象》经验,为你挑选了1个好方法。

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

ASP.NET中最简单的例子:

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

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

如果不能直接做到这一点,你有解决办法吗?不涉及代码修改的解决方法,只需在立即窗口或某些Watch表达式中编写代码.

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

"在你的代码中添加一个调试方法,它可以像迭代集合中的所有对象一样.然后你可以在调试模式下从即时窗口调用该方法,它会为你枚举各种各样的东西.把它想象成一个命令-line-debugger-helper.您可以根据需要编写尽可能多的内容."

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

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



1> Jeff Yates..:

您可以尝试使用立即窗口和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);

推荐阅读
mylvfamily
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有