无法想象一个更好的头衔如此重要..
我正在尝试将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>
'
答案 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>()));
}