一尘不染

IEnumerable和使用收益回报的递归

c#

我有一种IEnumerable<T>用于在WebForms页面中查找控件的方法。

该方法是递归的,当返回yield return值为递归调用的值时,在返回所需的类型时遇到一些问题。

我的代码如下所示:

    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)
            {
                yield return c.GetDeepControlsByType<T>();
            }
        }
    }

当前,这将引发“无法转换表达式类型”错误。但是IEnumerable<Object>,如果此方法返回type
,则代码会生成,但是在输出中返回了错误的类型。

有没有yield return同时使用递归的使用方法?


阅读 244

收藏
2020-05-19

共1个答案

一尘不染

在返回的方法内IEnumerable<T>yield return必须返回T,而不是返回IEnumerable<T>

更换

yield return c.GetDeepControlsByType<T>();

与:

foreach (var x in c.GetDeepControlsByType<T>())
{
  yield return x;
}
2020-05-19