Перебирать перечисляемый объект при отладке в Visual Studio - PullRequest
7 голосов
/ 21 октября 2008

Можно ли выполнять итерацию коллекции и перечислять только отфильтрованную информацию об объектах при отладке в Visual Studio? Я бы использовал для этого Немедленное окно, но, хотя оно позволяет выполнять методы на объектах, оно, похоже, не позволяет выполнять пользовательские операторы цикла.

Простейший пример в ASP.NET:

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

Как мы можем выполнить итерацию Page.Validators коллекции и найти недействительные + вывести их информацию в этой точке останова? (это не главный вопрос, это просто образец)

Если это невозможно сделать прямо, у вас есть какие-то обходные пути для этого? Обходные пути, которые не включают изменение кода, просто написание кода в окне Immediate или некоторое выражение Watch.

При поиске, я нашел только один обходной путь, цитируемый здесь (хотя не смог найти оригинал):

"Добавить метод отладки в ваш код, который делает что-то вроде перебора все объекты в коллекции. затем Вы можете вызвать этот метод из непосредственное окно в режиме отладки и будет перечислять разные вещи для тебя. Думайте об этом как командная строка, отладчик-помощник. Вы можете напишите столько, сколько хотите. "

Но это все еще обходной путь. Я представляю, что это должно быть выполнимо без слишком большого взлома и что еще более важно без изменения кода. Конечно, должно быть возможно сделать какие-то преобразования коллекции в одном выражении.

И давайте придерживаться неуниверсальных коллекций. Также кажется, что окно Immediate не принимает лямбда-выражения (при попытке получить ошибку: «Выражение не может содержать лямбда-выражения»)

1 Ответ

8 голосов
/ 21 октября 2008

Вы можете попробовать использовать непосредственное окно и вызов LINQ-to-objects.

Придуманный пример:

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

Обновление: по-видимому, это не будет работать, так как непосредственное окно не позволяет лямбды. Однако, если вы реализуете лямбду как метод только для отладки, вы можете сделать это.

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

А затем просто вызовите Where в ближайшем окне:

pages.Where(BreakPointPredicate);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...