没想到再有更好的标题了。
我正在尝试转换此方法,它将检索表单的所有子控件,作为扩展方法以及接受接口作为输入。到目前为止,我要
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>()在调用它以访问其属性时需要添加时。
OfType<T>()
例如(此==形式)
this.GetAll<IMyInterface>().OfType<IMyInterface>()
我正在努力使返回类型成为通用的返回类型IEnumerable<T>,这样我就不必包括OfType将返回相同结果但正确转换的a。
IEnumerable<T>
OfType
有人有什么建议吗?
(更改返回类型IEnumerable<T>导致Concat抛出
Concat
实例参数:无法从“ System.Collections.Generic.IEnumerable <T>” 转换为“ System.Linq.ParallelQuery <System.Windows.Forms.Control>”
<T>
<System.Windows.Forms.Control>
问题是,这Concat将需要一个IEnumerable<T>而不是一个IEnumerable<Control>。这应该可以工作:
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>())); }