3 回答
TA贡献1744条经验 获得超4个赞
在返回的方法内IEnumerable<T>,yield return必须返回T,而不是返回IEnumerable<T>。
更换
yield return c.GetDeepControlsByType<T>();
与:
foreach (var x in c.GetDeepControlsByType<T>())
{
yield return x;
}
TA贡献1811条经验 获得超4个赞
您需要产生递归调用产生的每个项目:
public static IEnumerable<Control> GetDeepControlsByType<T>(this Control control)
{
foreach(Control c in control.Controls)
{
if (c is T)
{
yield return c;
}
if(c.Controls.Count > 0)
{
foreach (Control control in c.GetDeepControlsByType<T>())
{
yield return control;
}
}
}
}
请注意,以这种方式进行递归会产生成本-您最终将创建大量的迭代器,如果您的控制树非常深,则可能会导致性能问题。如果要避免这种情况,则基本上需要在方法中自己进行递归,以确保仅创建一个迭代器(状态机)。有关更多详细信息和示例实现,请参见此问题 -但这显然也增加了一定数量的复杂性。
- 3 回答
- 0 关注
- 424 浏览
添加回答
举报