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

C# 用于查找泛型类型中的用户控件的递归函数,c#,list,generics,recursion,C#,List,Generics,Recursion,这是我的密码 private void FindControls<T>(Control control, List<T> list) { foreach (Control c in control.Controls) { if (c != null) { if (c is T) {

这是我的密码

    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);
                }
            }
        }
    }
private void find控件(控件控件,列表)
{
foreach(Control.Controls中的控件c)
{
如果(c!=null)
{
if(c是T)
{

list.Add(c);//您可以像操作符一样使用
来强制转换它

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

list.Add((c as T));//您可以使用
as
操作符来强制转换它

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

list.Add((c as T));//我已经试过了,但是我得到了:“类型参数'T'不能与'as'运算符一起使用,因为它既没有类类型约束,也没有'class'约束”为什么
as T
而不是cast
(T)
?@IvanStoev,有意义,但因为它处于条件
if(c是T)
转换为
不会有问题。我知道这是安全的:)我只是好奇你为什么首先选择那个,这反过来要求你添加约束。而另一个可以不受约束地工作。@IvanStoev,嗯,这是在发布答案时想到的,但是的,很好,谢谢你。包括这一点。我是L已经尝试过了,但我得到了:“类型参数'T'不能与'as'运算符一起使用,因为它既没有类类型约束,也没有'class'约束”为什么
as T
而不是cast
(T)
?@IvanStoev,这是有意义的,但因为它处于条件
if(c是T)下
转换为
不会有问题。。我知道这是安全的:)我只是好奇,为什么你一开始就选择了那个,这反过来又需要你添加约束。而另一个可以不受约束地工作。@IvanStoev,嗯,这是我在发布答案时想到的,但是的,很好,谢谢你。包括这一点。你呢你必须把C投给T。
private void FindControls<T>(Control control, List<T> list) where T : class
{
            if (c is T)
            {
                list.Add((T)c);  //<-- Problem is here
            }