Utilisation de C # pour obtenir de manière récursive une collection de contrôles à partir d’une collection de contrôles

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?

Problème:

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 .

Solution:

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.

Exemple:

 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); } } 
  • Vous n’avez également pas besoin de mot-clé de 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 .