IEnumerable と yield return を使用した再帰 質問する

IEnumerable と yield return を使用した再帰 質問する

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を返す必要があります。TIEnumerable<T>

交換する

yield return c.GetDeepControlsByType<T>();

と:

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

おすすめ記事