IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

XNA/Monogame Discussion :

[Délégué] Traitement sur liste d'objets génériques


Sujet :

XNA/Monogame

  1. #1
    Membre actif Avatar de Chen norris
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 216
    Points : 248
    Points
    248
    Par défaut [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 :



    Et quelque part dans mon programme, j'ai quelque chose qui ressemble à ça :
    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();
    J'ai donc voulu faire ceci :
    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);
    avec la méthode générique :
    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();
    }
    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
    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.
    Chen norris
    C/C++, C#, Java, PHP & SQL coder
    Web developer

  2. #2
    Membre actif Avatar de Chen norris
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 216
    Points : 248
    Points
    248
    Par défaut
    Bonjour,

    Après finalement plusieurs essais, j'ai réussi à résoudre mon problème. Pour ceux que ça intéresserait voici les quelques règles à respecter que j'ai tirées de mon problème :
    • Pour une raison que j'ignore encore, la méthode Toto() n'est pas visible car elle possède le mot clef override
      (la création de délégué se mélangerait-elle les pinceaux pour retrouver la bonne implémentation de Toto à instancier ?)
      J'ai donc créé une seconde méthode Toto2() dans chacune de mes classes filles où chacune appelle Toto() et là, c'est bon :
      j'arrive à instancer Toto2() correctement.
    • Toto2() n'est pas une méthode statique et du coup, je ne peux l'instancier de manière statique. J'ai donc déplacé
      l'instruction Delegate.CreateDelegate au sein de ma boucle foreach pour instancier la méthode à chaque élément traité (
      en espérant ne pas faire tomber les perfs de mon application par la même occasion...)

    Tout fonctionne maintenant comme sur des roulettes et j'ai un code qui ressemble relativement bien à ce que je recherchais.
    Je note donc la discussion comme résolue. En espérant que mes commentaires sur comment j'ai résolu mon problème puissent
    être utiles à tout visiteur de cette discussion
    Chen norris
    C/C++, C#, Java, PHP & SQL coder
    Web developer

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 10
    Dernier message: 16/11/2010, 10h26
  2. Tri sur liste d'objet
    Par topolino dans le forum ASP.NET
    Réponses: 5
    Dernier message: 23/01/2009, 11h59
  3. Problème Iterateur sur liste d'objets
    Par kornterstrike dans le forum SL & STL
    Réponses: 1
    Dernier message: 23/11/2007, 20h33
  4. Réponses: 5
    Dernier message: 10/10/2007, 12h29
  5. Aide sur POO :: Classe et liste d'objet
    Par Andry dans le forum Langage
    Réponses: 1
    Dernier message: 23/01/2006, 16h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo