[Délégué] Traitement sur liste d'objets génériques
Bonjour à tous,
Je travaille actuellement au développement d'un modeleur 3D en C# / XNA sous Windows XP mais je suis confronté à un problème de refactorisation de code que je n'arrive pas à mener à terme. Voici mon cas : je me suis rendu compte que dans une méthode, j'effectuais plusieurs fois exactement les même traitements mais sur plusieurs types d'objets différents (objets dérivant tous d'une classe mère commune). J'ai souhaité m'orienter vers les délégués pour créer une méthode contenant ces traitements et étant générique de manière à fonctionner avec tous mes objets.
Concrètement, voici ce que ça signifie :
Je possède une classe mère dérivée plusieurs fois, et chaque classe fille possède plusieurs méthodes dont une avec signature commune (appelons-la Toto() dans la suite de mon exemple). Avec un schéma, ça donne ceci :
http://imageshack.us/download/855/schemaexemple.png
Et quelque part dans mon programme, j'ai quelque chose qui ressemble à ça :
Code:
1 2 3 4 5 6 7
|
foreach (ClasseFille1 c1 in liste1)
c1.Toto();
foreach (ClasseFille2 c2 in liste2)
c2.Toto();
foreach (ClasseFille3 c3 in liste3)
c3.Toto(); |
J'ai donc voulu faire ceci :
Code:
1 2 3 4
|
TraitementGénérique(liste1);
TraitementGénérique(liste2);
TraitementGénérique(liste3); |
avec la méthode générique :
Code:
1 2 3 4 5 6
|
private static void TraitementGénérique<T>(List<T> elements) {
Delegate monDélégué = Delegate.CreateDelegate(typeof(T), parameter, typeof(T).GetMethod("Toto"));
foreach (T element in elements)
monDélégué.DynamicInvoke();
} |
Tout cela compile parfaitement mais à l'exécution, je me retrouve face à une erreur sur la ligne Delegate.CreateDelegate :
Code:
1 2 3 4 5 6 7 8
|
Interception de System.ArgumentException
Message="Le type doit dériver de Delegate.\r\nNom du paramètre*: type"
Source="mscorlib"
ParamName="type"
StackTrace:
à System.Delegate.CreateDelegate(Type type, MethodInfo method, Boolean throwOnBindFailure)
à System.Delegate.CreateDelegate(Type type, MethodInfo method) |
Si vous avez une idée de mon problème voire des conseils pour développer proprement ce que je cherche à faire, je suis preneur.
Merci d'avance.