Generic All Controls Method

本文关键字:Method Controls All Generic | 更新日期: 2023-09-27 18:20:57

想不出比这更好的标题了。。

我正在尝试将这个方法转换为一个扩展方法,并接受接口作为输入,该方法将检索表单的所有子控件。到目前为止,我在

public IEnumerable<Control> GetAll<T>(this Control control) where T : class
{
    var controls = control.Controls.Cast<Control>();
    return controls.SelectMany(ctrl => GetAll<T>(ctrl))
                                .Concat(controls)
                                .Where(c => c is T);
}

除了在调用它以访问其属性时需要添加CCD_ 1之外,它工作得很好。

例如(此==形式)

this.GetAll<IMyInterface>().OfType<IMyInterface>()

我正在努力将返回类型转换为通用返回类型IEnumerable<T>,这样我就不必包含OfType,它只会返回相同的结果,但转换正确。

有人有什么建议吗?

(将返回类型更改为IEnumerable<T>会导致Concat抛出

实例参数:无法从"System.Collections.Generic.IEnumerable <T>"转换为"System.Linq.ParallelQuery <System.Windows.Forms.Control>"

Generic All Controls Method

问题是Concat也想要IEnumerable<T>,而不是OfType<T>()0。这应该是可行的:

public static IEnumerable<T> GetAll<T>(this Control control) where T : class
{
    var controls = control.Controls.Cast<Control>();
    return controls.SelectMany(ctrl => GetAll<T>(ctrl))
                                .Concat(controls.OfType<T>()));
}