Моя рекурсивная функция по какой-то причине пропускает сам вызов - PullRequest
0 голосов
/ 27 апреля 2018

Я уверен, что есть лучший способ сделать это, но я просто хочу знать, почему это не работает. Во время отладки отладчик пропускает GetAllChildren (

    public static IEnumerable<DependencyObject> GetAllChildren(DependencyObject d)
    {
        if (d.GetType().GetProperties().Any(p => p.Name == "Content"))
        {
            var v = (DependencyObject)(d.GetType().GetProperty("Content").GetValue(d));
            GetAllChildren(v);
            yield return v;
        }
        if (d.GetType().GetProperties().Any(p => p.Name == "Children"))
        {
            foreach (DependencyObject v in (UIElementCollection)d.GetType().GetProperty("Children").GetValue(d))
            {
                yield return v;
                GetAllChildren(v);
            }
        }
    }

1 Ответ

0 голосов
/ 27 апреля 2018

Это потому, что вы используете возвращение доходности с IEnumerable.

Как только вы переберите результат своей функции, код будет выполнен. Это называется отложенной оценкой и также является ключевым аспектом LINQ. Чтобы понять отложенное выполнение, прочитайте this .

На самом деле, у вас есть другая ошибка. Ваш код даже не вернет результат вашего рекурсивного вызова. Вы ничего не делаете с этим. Вам нужно будет сделать это:

yield return v;
foreach (var child in GetAllChildren(v))
{
  yield return child;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...