3 回答

TA貢獻(xiàn)1744條經(jīng)驗(yàn) 獲得超4個贊
在返回的方法內(nèi)IEnumerable<T>,yield return必須返回T,而不是返回IEnumerable<T>。
更換
yield return c.GetDeepControlsByType<T>();
與:
foreach (var x in c.GetDeepControlsByType<T>())
{
yield return x;
}

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超4個贊
您需要產(chǎn)生遞歸調(diào)用產(chǎn)生的每個項(xiàng)目:
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;
}
}
}
}
請注意,以這種方式進(jìn)行遞歸會產(chǎn)生成本-您最終將創(chuàng)建大量的迭代器,如果您的控制樹非常深,則可能會導(dǎo)致性能問題。如果要避免這種情況,則基本上需要在方法中自己進(jìn)行遞歸,以確保僅創(chuàng)建一個迭代器(狀態(tài)機(jī))。有關(guān)更多詳細(xì)信息和示例實(shí)現(xiàn),請參見此問題 -但這顯然也增加了一定數(shù)量的復(fù)雜性。
- 3 回答
- 0 關(guān)注
- 468 瀏覽
添加回答
舉報