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 回答