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 :

Utilisation de délégués "génériques"


Sujet :

C#

  1. #1
    Membre régulier
    Inscrit en
    Juin 2008
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 54
    Points : 75
    Points
    75
    Par défaut Utilisation de délégués "génériques"
    Bonjour,

    Je voudrais pouvoir passer une méthode en paramètre sans connaitre le nombre de paramètres ni le type de ceux-ci.

    Pour cela je voudrais utiliser un délégué du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public class MaClass
    {
        private Delegate monDelegue
     
        public MaClass(Delegate maMethod)
        {
            monDelegue = maMethod;
        }
     
        public void Execute (params object[] parameters)
        {
            monDelegue.DynamicInvoke(parameters);
        }
    }
    Mon problème c'est que le code suivant ne fonctionne pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var call = new MaClass(uneMethode);
    J'ai l'erreur
    Impossible de convertir de 'groupe de méthodes' en 'System.Delegate'
    Quelqu'un pourrait-il m'aider à comprendre mon erreur ?

    Merci D'avance

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Quand le type du delegate est déclaré explicitement, le compilateur peut automatiquement convertir un nom de méthode en un delegate de ce type. Mais dans ton cas, tu ne précises pas le type de delegate : n'importe quel delegate est accepté, et si tu indiques juste le nom de la méthode le compilateur ne peut pas savoir quel type de delegate il doit créer.

    Suppose que tu aies plusieurs surcharges de uneMethode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void uneMethode(int x) { ... }
     
    void uneMethode(int x, int y) { ... }
    Maintenant, si tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var call = new MaClass(uneMethode);
    De quelle méthode uneMethode parles-tu ? Celle qui a un paramètre, ou celle qui en a deux ? Pour lever l’ambiguïté, il faut donc préciser explicitement le type de delegate :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // Pour la surcharge avec un paramètre de type int
    var call = new MaClass(new Action<int>(uneMethode));
     
    // Pour la surcharge avec 2 paramètres de type int
    var call = new MaClass(new Action<int, int>(uneMethode));

  3. #3
    Membre émérite
    Avatar de azstar
    Homme Profil pro
    Architecte Technique BizTalk/.NET
    Inscrit en
    Juillet 2008
    Messages
    1 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Technique BizTalk/.NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 198
    Points : 2 424
    Points
    2 424
    Par défaut
    Bonjour,

    si j'ai compris ce que vous voulez faire alors je dit

    tu peut utilise une methode de ce type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Object  methode(object[] params);
    et a l'aide de réflexion tu peut détermine les types de tes paramètres et faire le traitement nécessaire.


    j’espère que j'ai bien compris ton problème

  4. #4
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Hello,
    le contexte dans lequel tu aurais besoin de faire ça n'étant précisé, je suppose qu'il peut être satisfait différemment de ce que tu as commencé à faire. Tu veux "stocker", une méthode, pour l'appeler plus tard, c'est ça ? Si tu connais à l'avance les paramètres à passer (alors que ta façon de faire permet d'abord de capturer la méthode, puis lui donner les arguments à manger plus tard), tu peux utiliser une méthode anonyme. Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // on n'a besoin que de ce delegate
    public delegate void TonDelegate();
    public class M
    {
      private readonly TonDelegate d;
      public M(TonDelegate d) { this.d = d; }
      public void Execute() { d(); }
    }
     
    M m = new M(() => this.MaMéthode(arg1, arg2, arg3));
    m.Execute(); // hop, ici MaMéthode est appelée
    ಠ_ಠ

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    @Guulh, pas la peine de déclarer un delegate spécifique, il y a déjà Action qui fait très bien l'affaire

  6. #6
    Membre régulier
    Inscrit en
    Juin 2008
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 54
    Points : 75
    Points
    75
    Par défaut
    Merci beaucoup pour toutes ces réponses.

    En fait, je veux utiliser ça dans une messagerie avec un système de Callback. C'est pourquoi je ne connais rien des méthodes passées en paramètre.

    Dans tous les cas la solution proposée par tomlev fonctionne parfaitement et l'explication est très claire.

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

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