J’essaie actuellement d’extraire une collection de contrôles créés dynamicment (cases à cocher et listes déroulantes) d’une collection de contrôles récursive (répéteur). C’est le code que j’utilise.
private void GetControlList(ControlCollection controlCollection, ref List resultCollection) { foreach (Control control in controlCollection) { if (control.GetType() == typeof(T)) resultCollection.Add((T)control); if (control.HasControls()) GetControlList(controlCollection, ref resultCollection); } }
J’ai des problèmes avec la ligne suivante:
resultCollection.Add((T)control);
Je reçois l’erreur …
Cannot convert type 'System.Web.UI.Control' to 'T'
Des idées?
Puisque T
peut être un reference type
ou un value type
, le compilateur a besoin de plus d’informations.
Vous ne pouvez pas convertir et Integer
to Control
.
Pour résoudre ce problème, ajoutez where T : Control
ou where T : class
(une contrainte plus générale) pour indiquer que T
sera toujours un type de référence.
private void GetControlList(ControlCollection controlCollection, ref List resultCollection) where T : Control { foreach (Control control in controlCollection) { //if (control.GetType() == typeof(T)) if (control is T) // This is cleaner resultCollection.Add((T)control); if (control.HasControls()) GetControlList(control.Controls, ref resultCollection); } }
ref
. Puisque List est un type de référence, sa référence sera transmise. Le changer en
var c = control as T; if (c != null) resultCollection.Add(c);
Ce sera plus rapide que votre code, car il n’appelle pas GetType()
.
Notez qu’il appenda également des contrôles qui héritent de T
Vous devrez également contraindre le paramètre type en ajoutant where T : Control
.