通用所有控制方法
想不到更好的标题,所以appologies ..
我试图转换这个方法 ,它将检索一个窗体的所有子控件,作为扩展方法以及接受接口作为input。 到目前为止,我是最好的
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>()
我努力使返回types转换为generics返回typesIEnumerable<T>
,所以我不必包含一个只返回相同结果但正确转换的OfType。
任何人有任何build议?
(将返回types更改为IEnumerable<T>
会导致Concat
抛出
实例参数:无法从“System.Collections.Generic.IEnumerable
<T>
”转换为“System.Linq.ParallelQuery<System.Windows.Forms.Control>
”
问题是, 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>())); }