由于某种原因,我的递归函数跳过调用自身

时间:2018-04-27 12:30:54

标签: c# wpf recursion yield-return

我确信有更好的方法可以做到这一点,但我只是想知道为什么这不起作用。在调试时,调试器会跳过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 :(得分:4)

这是因为你使用IEnumerable的回报率。

一旦迭代了函数的结果,代码就会被执行。这称为延迟评估,也是LINQ的一个关键方面。要了解默认执行情况,请阅读this

实际上,你还有另外一个错误。您的代码甚至不会返回递归调用的结果。你没有做任何事情。你必须这样做:

yield return v;
foreach (var child in GetAllChildren(v))
{
  yield return child;
}