我使用这样的方法返回容器中的所有控件:

public static IEnumerable<Control> NestedControls(this Control container, bool search_all_children = true)
{
    var stack = new Stack<Control>();
    stack.Push(container);
    do
    {
        var control = stack.Pop();

        foreach (Control child in control.Controls)
        {
            yield return child;
            stack.Push(child);
        }
    }
    while (stack.Count > 0 && search_all_children);
}

这样我就可以得到所有的控件:

var textboxes = panel1.NestedControls().OfType<TextBox>().ToList();

但是,通过在方法中添加额外的代码片段,我不能只获取容器中特定类型的控件.对于下面这样的代码,我应该如何更新方法?

var textboxes = panel1.NestedControls(TextBox);

推荐答案

您可以很容易地将此方法更改为泛型方法,以便仅返回特定类型的子级:

public static IEnumerable<T> NestedControls<T>(this Control container, bool search_all_children = true) where T : Control
{
    var stack = new Stack<Control>();
    stack.Push(container);
    do
    {
        var control = stack.Pop();

        foreach (Control child in control.Controls)
        {
            // Admittedly, not the best choice of name here...
            if(child is T childToReturn)
            {
                yield return childToReturn;
            }
            stack.Push(child);
        }
    }
    while (stack.Count > 0 && search_all_children);
}

用途:

var textboxes = panel1.NestedControls<TextBox>();
var allNestedControls = panel1.NestedControls<Control>();

您还可以非常轻松地添加非泛型重载以返回所有嵌套控件,而不必指定Control:

public static IEnumerable<Control> NestedControls(this Control container, bool search_all_children = true) 
   => NestedControls<Control>(container, search_all_children);

Csharp相关问答推荐

发布.NET框架项目将.NET核心元素注入到web. connect中

为什么xslWriter不总是按照xslWriterSet中指定的格式格式化该文档?

.NET 6控制台应用程序,RabbitMQ消费不工作时,它的程序文件中的S

发布用于Linux Ubuntu的C#应用程序

如何在页面重新加载后保持菜单切换状态

从.Net 6 DLL注册和检索COM对象(Typelib导出:类型库未注册.(异常来自HRESULT:0x80131165))

C#和ASP.NET核心标识:提高GetUserAsync调用的性能

如何将端点(或с匹配请求并判断其路径)添加到BCL?

使用System.Text.Json进行序列化时发生StackOverflow异常

如何在onNext之前等待订阅者完成?

如何从另一个类的列表中按ID取值

如何在特定环境中运行dotnet测试?

当我手动停止和关闭系统并打开时,Windows服务未启动

Linq SELECT的多条指令

如何使用.NET 8.0中新的CompositeFormat类?

Xamarin.Forms中具有类似AspectFill的图像zoom 的水平滚动视图

如何在特定时间间隔运行多个后台任务?

与另一个对象位于同一位置的对象具有不同的变换位置

如何在JSON:API中定义的&过滤查询参数系列&标准的GET请求中传递多个相关参数?

根据运行时值获取泛型类型的字典