C# 作为参数的泛型类型

C# 作为参数的泛型类型,c#,asp.net,list,generics,C#,Asp.net,List,Generics,我的第一个问题是,是否可以指定泛型类型作为参数, 第二,我下面列出的伪代码可能吗 我假设它将使用.NET4.0和dynamics修改器,但我对4.0之前的解决方案更感兴趣 public static void SomeMethod(List<T> l, Type type, Control samplecontrol) { l.Add((type)samplecontrol); } 编辑: 这是我的解决方案 public static vo

我的第一个问题是,是否可以指定泛型类型作为参数, 第二,我下面列出的伪代码可能吗

我假设它将使用.NET4.0和dynamics修改器,但我对4.0之前的解决方案更感兴趣

    public static void SomeMethod(List<T> l, Type type, Control samplecontrol)
    {
     l.Add((type)samplecontrol);
    }
编辑:

这是我的解决方案

    public static void FindControlRecursive<T>(Control parent, List<T> l)
    {
        foreach (var ctrl in parent.Controls)
        {
            if (ctrl.GetType() == typeof(T))
                l.Add((T)ctrl);
            if (((Control)ctrl).Controls != null && ((Control)ctrl).Controls.Count > 0)
                foreach (Control _ctrl in ((Control)ctrl).Controls)
                    FindControlRecursive<T>(_ctrl, l);
        }
    }
你是说这个

public static void SomeMethod<T>(List<T> l, T item)
{
    l.Add(item);
}
试试这个

public static void YourMethodName<T>(List<T> l, Control samplecontrol)
{
    l.Add((T)samplecontrol);
}

是的,这是可能的,而且从C2.0开始就有了。这可能就是您要查找的语法:

public static void AddControlToList<T>(List<T> list, Control sampleControl)
{
    list.Add((T)sampleControl)
}

您需要将已修改的泛型类型添加到方法名称中。这将替换您试图传入的类型参数

public static Add<T>(List<T> l, T samplecontrol)
{
 l.Add(samplecontrol);
}
还可以将类型限定符添加到方法中

public static Add<T>(List<T> l, T samplecontrol) 
    where T : Control
{
 l.Add(samplecontrol);
}
看看这个比较:ctrl.GetType==typeofT-你确定这是你真正想要的吗?如果您将ButtonBase等传递为T,则它将与ButtonBase派生的按钮或复选框不匹配。也许你希望ctrl是T?此外,如果您编写foreach控件ctrl,则不需要强制转换AddTctrl和所有控件ctrl。。。而不是foreach var ctrol…-后者的问题是控件集合不是泛型的,所以var被推断为对象。