递归函数,用于查找泛型类型中的用户控件

本文关键字:用户 控件 泛型类型 用于 查找 递归函数 | 更新日期: 2023-09-27 18:01:00

这是我的代码

    private void FindControls<T>(Control control, List<T> list)
    {
        foreach (Control c in control.Controls)
        {
            if (c != null)
            {
                if (c is T)
                {
                    list.Add(c);  //<-- Problem is here
                }
                else
                {
                    FindControls<T>(c, list);
                }
            }
        }
    }

我收到的消息

"的最佳过载匹配"System.Collection.Generic.List.Add(T("包含一些无效参数">

这是另一种找到特定控制的方法

    private void MyMethod(Employee e)
    {
        List<MyUserControlType> employees = new List<MyUserControlType>();
        this.FindControls<MyUserControlType>(this.MyControlRoot, employees);
        foreach (var employee in employees)
        {
            ....
        }
    }

我想返回一个MyUserControlType类型的控件列表,它不是从Control类型继承的。从UserControl 继承

我该如何解决此问题?

递归函数,用于查找泛型类型中的用户控件

您可以使用类似的as运算符进行强制转换

            if (c is T)
            {
                list.Add((c as T));  //<-- Problem is here
            }

可以通过修改方法定义来设置该约束

private void FindControls<T>(Control control, List<T> list) where T : class
{

(OR(正如@Ivan在评论中指出的那样,您可以使用强制转换运算符直接强制转换它,这不需要您在方法中放置泛型约束

            if (c is T)
            {
                list.Add((T)c);  //<-- Problem is here
            }