2009-11-26 2 views
0

Мой первый вопрос: можно ли указать общий тип как параметр, во-вторых, возможно ли что-нибудь вроде псевдо-кода ive, перечисленного ниже?Общий тип как параметр

Предполагаю, что он будет использовать .net 4.0 и модификатор динамики, но меня больше интересует решение до 4.0.

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

Edit:

Вот мое решение ...

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'? Кроме того, вам не нужно создавать в 'Add ((T) ctrl)' и все '(Control) ctrl', если вы пишете' foreach (Control ctrl ...) ', а не' foreach (var ctrol .. .) '- проблема с последним заключается в том, что коллекция' Controls' не является общей, поэтому 'var' выводится на' object.' –

ответ

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); 
} 
Смежные вопросы