我确信有更好的方法可以做到这一点,但我只是想知道为什么这不起作用。在调试时,调试器会跳过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);
}
}
}
答案 0 :(得分:4)
这是因为你使用IEnumerable的回报率。
一旦迭代了函数的结果,代码就会被执行。这称为延迟评估,也是LINQ的一个关键方面。要了解默认执行情况,请阅读this。
实际上,你还有另外一个错误。您的代码甚至不会返回递归调用的结果。你没有做任何事情。你必须这样做:
yield return v;
foreach (var child in GetAllChildren(v))
{
yield return child;
}