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 :
Et quelque part dans mon programme, j'ai quelque chose qui ressemble à ça :
J'ai donc voulu faire ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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();
avec la méthode générique :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 TraitementGénérique(liste1); TraitementGénérique(liste2); TraitementGénérique(liste3);
Tout cela compile parfaitement mais à l'exécution, je me retrouve face à une erreur sur la ligne Delegate.CreateDelegate :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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(); }
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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)
Merci d'avance.
Partager