我有一种IEnumerable<T>用于在WebForms页面中查找控件的方法。
IEnumerable<T>
该方法是递归的,当返回yield return值为递归调用的值时,在返回所需的类型时遇到一些问题。
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 ,则代码会生成,但是在输出中返回了错误的类型。
IEnumerable<Object>
有没有yield return同时使用递归的使用方法?
在返回的方法内IEnumerable<T>,yield return必须返回T,而不是返回IEnumerable<T>。
T
更换
yield return c.GetDeepControlsByType<T>();
与:
foreach (var x in c.GetDeepControlsByType<T>()) { yield return x; }