を持っています IEnumerable<T>
WebFormsページでコントロールを見つけるために使用しメソッドがあります。
メソッドは再帰的でありyield return
、再帰呼び出しの値がreturnigであるときに、必要なタイプを返すときに問題が発生します。
私のコードは次のようになります:
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
再帰を使用しながら使用する方法はありますか?
if(c.Controls.Count > 0)
-> if(c.Controls.Any())
、特に降伏している場合:)
yield
。以下を参照してください:)そして、それもワンライナーです:)
yield return
再帰関数ではメモリ使用量が爆発的に増加するので、注意して回避する必要があります。参照stackoverflow.com/a/30300257/284795を