C# 如何在整个控件链中查找类型为的控件?

C# 如何在整个控件链中查找类型为的控件?,c#,winforms,controls,C#,Winforms,Controls,我想在表单中找到实现某个接口的所有控件(比如ITestInterface)。我试过这个: this.Controls.OfType<ITestInterface>(); this.Controls.OfType(); 但是它只有一层深(不管是用-@dasblinkenlight写的),因此,例如,如果我有一个表单中的面板和面板中的ITestInterface控件,它将找不到它 怎么做 编辑:正如@HansPassant在一篇评论中所写,我可以硬编码我的面板名称,但是,我需要一个

我想在表单中找到实现某个接口的所有控件(比如
ITestInterface
)。我试过这个:

this.Controls.OfType<ITestInterface>();
this.Controls.OfType();
但是它只有一层深(不管是用-@dasblinkenlight写的),因此,例如,如果我有一个表单中的面板和面板中的
ITestInterface
控件,它将找不到它

怎么做



编辑:正如@HansPassant在一篇评论中所写,我可以硬编码我的面板名称,但是,我需要一个通用的解决方案,而不是特定形式的特定解决方案。

您必须使用递归并逐步通过控件的
属性:

private IEnumerable<T> GetAllOfType<T>(Control rootControl)
{
    return rootControl.Controls.OfType<T>().
           Concat(rootControl.Controls.OfType<Control>().SelectMany(GetAllOfType<T>));

}
private IEnumerable GetAllOfType(控件根控件)
{
返回rootControl.Controls.OfType()。
Concat(rootControl.Controls.OfType().SelectMany(GetAllOfType));
}
您可以这样使用:

var allOfTestInterface = GetAllOfType<ITestInterface(this);

var allOfTestInterface=GetAllOfTypeHint:使用递归。(Control.Controls/Control.Parent)考虑panel1.Controls而不是这个。Controls@HansPassant-我需要的解决方案是一般性的,而不是特定于特定的表格。您没有编写“一般解决方案”。不清楚您需要什么帮助,因为Peter的评论肯定会有帮助。@HansPassant-我已经编辑了这个问题。@DasbLinkedIn是的,措辞相当模糊,他们并没有说包含嵌套控件,他们说您可以使用
控件
来“迭代表单的所有控件,包括嵌套控件”,这不是100%相同;)