获取控件中类型为T的子控件

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>)'存在一些无效参数。

如何解决这个问题?
1个回答

3

尝试在GetControlsOfType<T>(ctrl)后添加.OfType<Control>(),并使用替代您的Where

因此,您的代码应该如下所示:

return controls.SelectMany(ctrl => GetControlsOfType<T>(ctrl).OfType<Control>())
                                  .Concat(controls)
                                  .OfType<T>();

他想要返回 IEnumerable<T> -- 这样不会返回 IEnumerable<Control> 吗? - Jon B
GetControlsOfType<T>(ctrl) 已经具有 IEnumerable<Control> 类型。为什么这里需要 OfType<Control>() - ca9163d9
2
@NickW 因为 'System.Collections.Generic.IEnumerable<T>' 没有包含 'Concat' 的定义,但是 IEnumerable<Control> 包含。你经常会发现相同的问题与具有相同解决方法的 Collection :) - dav_i
@dav_i 很有趣,不知道为什么微软没有为 IEnumerable<T> 创建 Concat - ca9163d9

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接