3

タイプのすべての子コントロールを取得する次の関数があります。

    private IEnumerable<Control> GetControlsOfType(Control control, Type type)
    {
        var controls = control.Controls.Cast<Control>();

        return controls.SelectMany(ctrl => GetControlsOfType(ctrl, type))
                                  .Concat(controls)
                                  .Where(c => c.GetType() == type);
    }

ジェネリック型パラメーターを使用して変換しようとしています。

    private IEnumerable<T> GetControlsOfType<T>(Control control) where T: Control
    {
        var controls = control.Controls.Cast<Control>();

        return controls.SelectMany(ctrl => GetControlsOfType<T>(ctrl))
                                  .Concat(controls)
                                  .Where(c => c.GetType() == T);
    }

コードに のエラーがあります.Concat

エラー 6 'System.Collections.Generic.IEnumerable <T>' には 'Concat' の定義が含まれておらず、最適な拡張メソッド オーバーロード 'System.Linq.Queryable.Concat <TSource>(System.Linq.IQueryable <TSource>, System.Collections.Generic. IEnumerable <TSource>)' に無効な引数があります

問題を解決するには?

4

1 に答える 1

3

.OfType<Control>()の後GetControlsOfType<T>(ctrl)と代わりに追加してみてくださいWhere

したがって、コードは次のようになります。

return controls.SelectMany(ctrl => GetControlsOfType<T>(ctrl).OfType<Control>())
                                  .Concat(controls)
                                  .OfType<T>();
于 2012-11-26T15:29:25.413 に答える