如何在整个控件链中找到类型控件? [重复]

问题描述 投票:-1回答:1

这个问题在这里已有答案:

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

this.Controls.OfType<ITestInterface>();

但它只有一层深(尽管用MSDN写的 - @dasblinkenlight),所以如果例如,我在面板中有一个面板,面板内有一个ITestInterface控件,它就找不到了。

怎么做?


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

c# winforms controls
1个回答
2
投票

您必须使用递归并逐步执行控件的Controls属性:

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

}

你可以这样使用:

var allOfTestInterface = GetAllOfType<ITestInterface(this);

它接受根控件直接包含的所有控件(使用OfType<>()调用),然后再次为该控件包含的所有控件调用该方法,从而递归所有容器。 SelectMany将这个嵌套列表展平为一个列表。

© www.soinside.com 2019 - 2024. All rights reserved.