通用所有控制方法

时间:2013-07-03 17:21:08

标签: c# winforms linq generics

无法想象一个更好的头衔如此重要..

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

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,它只会返回相同的结果,但会正确转换。< / p>

有人有任何建议吗?

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

  

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

1 个答案:

答案 0 :(得分:3)

问题在于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>()));
}