1. ホーム
  2. c#

[解決済み】yield returnを使ったIEnumerableとRecursionについて

2022-03-27 17:38:45

質問

私は 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>();
        }
    }
}

これは現在、"Cannot convert expression type" エラーを投げています。しかし、このメソッドが型 IEnumerable<Object> の場合、コードはビルドされますが、出力には間違った型が返されます。

を使用する方法はありますか? yield return 再帰を使いながら?

どのように解決するのですか?

を返すメソッドの内部で IEnumerable<T> , yield return を返さなければなりません。 T でなく IEnumerable<T> .

交換

yield return c.GetDeepControlsByType<T>();

を使っています。

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