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

C# Discussion :

Levée d'événement par reflection


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2012
    Messages : 133
    Par défaut Levée d'événement par reflection
    Bonjour,

    Je viens vers vous car j'ai un problème que je ne sais résoudre.

    J'ai une List<MethodInfo> que j'appelle grâce à un Invoke(), comme ceci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    foreach (var meth in lesMethodesQuilFautInvoker)
    {
          object[] parameters = { mesParametresDeMethodes };
          meth.Invoke(m_handler, parameters);
    }
    Ici mesParametresDeMethodes est quelque chose d'arbitraire que j'ai mis pour montrer que ce sont les paramètres.

    Chaque méthode est construit de la même façon, et certaines d'entre eux lance des événements, comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TextReceived(null, new TextReceivedEventArgs(text));
    Ici j'ai mis un événement TextReceived, mais ça peut être un événement qui porte un nom totalement différent, selon la méthode appelée.

    Ma question est, comment m'abonner à cet événement sachant que mon objet "m_handler" est lui aussi créé par reflexion.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_handler = (IHandler) Activator.CreateInstance(typeOfTheHandler);
    Je ne peux pas faire de m_handler.TextReceived + = laMethode puisque m_handler, au moment de la compilation est un IHandler et c'est au moment de l'exécution qu'il se transformera dans le type d'objet héritant de IHandler.

    Comment puis-je capter cet événement ?

    Merci beaucoup pour votre aide, là je sèche complètement,

  2. #2
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Par défaut
    une interface peut définir un évènement... donc, tu peux très bien abonné l'event sur une méthode...

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2012
    Messages : 133
    Par défaut
    Donc je dois rattacher tous les évènements possibles de toutes les classes héritant de IHandler, dans mon interface ?

  4. #4
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Par défaut
    tous les event, je ne sais pas, mais au moins ceux dont tu veux récupérer le déclenchement.

    Pour info, en terme de performance, trop utiliser les interfaces n'est pas l'idéal... il vaut mieux parfois utiliser des classes plutôt que des interfaces
    car, tu y gagnes beaucoup en vitesse d'exécution (la reflection est un mécanisme "coûteux" en temps d'exécution)...

    (J'avais déjà testé dans une application où tout était définit via interface, et au final, on a opté pour limiter grandement les interfaces, qui a diminuer les 12000 types
    de pattern qu'un collègue voulait absolument ie: decorator, etc...)

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2012
    Messages : 133
    Par défaut
    Oui je sais très bien que la performance s'en ressent.

    En fait, c'est lorsque je reçois un packet sur le réseau, je veux l'orienter vers la classe qui se charge de ce type de packet. Un se charge des packets clients par exemple.
    Donc j'ai un certains nombres de classe en fonction des catégories de packet, c'est un choix de ma part. Je pourrais tout mettre dans la même classe et tous les packets seraient gérées par cette classe mais ça sera vite le bordel.

    Donc au moment de la réception j'identifie la catégorie pour connaitre la classe (qui hérite d'IHandler) vers laquelle je vais l'orienter.
    C'est pour ça que j'ai définie une interface, pour pouvoir faciliter la création via Activator.

    Car mettre tous les évènements que je veux récupérer dans l'interface reviendrait au premier choix que je voulais éviter

    C'est impossible de faire un EventHandler custom que l'on attache au MethodInfo.Invoke ?

  6. #6
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Par défaut
    bonjour

    Pour la dernière question, je n'ai pas d'idée pour l'instant.

    Pour ce qui est de la gestion des envois en réseau, en général, je travaille avec une classe qui envoie les données avec un payload....

    genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Class PacketEncapsulation
    {
           un enum pour le type... (par exemple)
           object payload  (l'objet qui contient l'information)...
    }
    et après, en fonction du type de l'objet, je fais un cast approprié...

    Evidemment, dans mon utilisation, je n'ai pas 12000 classes, donc, je n'ai pas vraiment l'intérêt à mettre en place en mécanisme qui me permettra de facilement
    ajouter de nouvelles classes puisque je pars sur des situations relativement simples, peu évolutives et maitrisées dès le début...

    En général, mais je fais que des programmes pour des "PME", je préfère éviter les systèmes qui permettent de facilement ajouter pleins de choses parce que:

    1 - C'est plus compliqué à développer (enfin, plus long souvent)
    2 - Un peu "usine" à gaz

    et surtout au final, on se rend compte que souvent, tous les mécanismes mis en place pour aider à une évolution du soft, ajout de fonctionnalité, etc.. , ne servira pas
    car le client ne fera jamais les évolutions...

    voilà.. c'est juste un petit retour sur Expérience...

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

Discussions similaires

  1. [GLib]: Gestion d'évènements par GMainLoop
    Par rvsgm09 dans le forum GTK+
    Réponses: 0
    Dernier message: 06/08/2009, 12h22
  2. fichier de configuration par reflection
    Par faabriice dans le forum C#
    Réponses: 3
    Dernier message: 09/04/2008, 13h42
  3. Réponses: 6
    Dernier message: 02/01/2007, 12h16
  4. VC# -Déclencher un évènement par le programme
    Par epc dans le forum Windows Forms
    Réponses: 2
    Dernier message: 06/10/2006, 13h47
  5. Réponses: 6
    Dernier message: 12/05/2006, 15h20

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