一尘不染

通用所有控件方法

c#

没想到再有更好的标题了。

我正在尝试转换此方法,它将检索表单的所有子控件,作为扩展方法以及接受接口作为输入。到目前为止,我要

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);
}

它工作正常,除了OfType<T>()在调用它以访问其属性时需要添加时。

例如(此==形式)

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

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

有人有什么建议吗?

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

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


阅读 285

收藏
2020-05-19

共1个答案

一尘不染

问题是,这Concat将需要一个IEnumerable<T>而不是一个IEnumerable<Control>。这应该可以工作:

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>()));
}
2020-05-19