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>();
}
}
}
現在、これは「式の型を変換できません」というエラーをスローします。ただし、このメソッドが type を返す場合IEnumerable<Object>
、コードはビルドされますが、出力に間違った型が返されます。
yield return
再帰も使用しながら使用する方法はありますか?
ベストアンサー1
を返すメソッド内ではIEnumerable<T>
、ではなくyield return
を返す必要があります。T
IEnumerable<T>
交換する
yield return c.GetDeepControlsByType<T>();
と:
foreach (var x in c.GetDeepControlsByType<T>())
{
yield return x;
}