2009-11-26 152 views
0

我的第一个问题是,是否可以指定泛型类型作为参数,其次,是否可以使用下面列出的伪代码?作为参数的泛型类型

我认为它将使用.net 4.0和动态修改器,但我更喜欢pre 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); 
     } 
    } 
+1

看着这个比较:'ctrl.GetType()== typeof运算(T)' - 你确定这是你真正想要的吗?如果你通过例如'ButtonBase'为'T',它不会匹配'Button'或'CheckBox'(它们都来自'ButtonBase')。也许你想'ctrl是T'而不是?另外,如果你编写'foreach(Control ctrl ...)'而不是'foreach(var ctrol ..),你不需要在添加((T)ctrl)'和所有'(Control)ctrl'中进行转换。 。)' - 后者的问题是'Controls'集合不是泛型的,所以'var'被推断为'object'' – 2009-11-26 17:16:58

回答

6

你说这个?

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

试试这个

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

是的,这是可能的,而且一直以来C#2.0。这可能是您正在查找的语法:

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

您需要将修改后的通用类型添加到方法名称中。这将取代您试图通过在你的类型参数,

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); 
}