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 :

createDelegate renvoie une exception


Sujet :

C#

  1. #1
    Membre éclairé Avatar de ZaaN
    Inscrit en
    Novembre 2005
    Messages
    819
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 819
    Par défaut createDelegate renvoie une exception
    hello
    j ai une methode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    protected bool AlphaTest(COperation _OpToCheck)
            {
                Debug.WriteLine("AlphaTest");
                return true;
            }
    j ai aussi un delegate qui ressemble a ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    protected delegate bool CheckFunction(ICheckable _ObjectToCheck);
    Sachant que la classe COperation implemente ICheckable,
    je tente ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CheckFunction F1 = (CheckFunction)Delegate.CreateDelegate(typeof(CheckFunction), method);
    (method etant le methodInfo de la fonction AlphaTest)

    mais j ai une exception de type : Erreur lors de la liaison avec la méthode cible. Qui peux me dire qu'est-ce qui genere cette erreure ? merci bcp bcp

    PS: je suis en .Net 3.5

  2. #2
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Le prototype de la méthode appelée doit correspondre exactement au prototype du type délégué. Comme ce n'est pas le cas dans ton exemple, tu te retrouves avec cette exception

    Par contre, tu peux modifier ta méthode ainsi par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    protected bool AlphaTest(ICheckable _OpToCheck)
    {
        COperation operation = _OpToCheck as COperation
     
        if (operation == null)
        {
            throw new ArgumentException("Le type du paramètre est incorrect.", "_OpToCheck");
        }
     
        Debug.WriteLine("AlphaTest");
        return true;
    }

  3. #3
    Membre éclairé Avatar de ZaaN
    Inscrit en
    Novembre 2005
    Messages
    819
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 819
    Par défaut
    en changeant le type du paramètre comme conseillé, je retrouve la meme exception...

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Citation Envoyé par ZaaN Voir le message
    en changeant le type du paramètre comme conseillé, je retrouve la meme exception...
    Si tu modifies ton delegate comme ac :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    protected delegate bool CheckFunction<T>(T _ObjectToCheck) where T : ICheckable;
    Ça devrait rouler.

  5. #5
    Membre éclairé Avatar de ZaaN
    Inscrit en
    Novembre 2005
    Messages
    819
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 819
    Par défaut
    aaaarg ca change absoluement rien

  6. #6
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Tu pourrais mettre le code que tu utilises actuellement dans un exemple prêt à compiler, histoire de voir ce qui cloche. Parce que ma méthode ainsi que celle de Guulh (j'avais complétement zappé les génériques ^^) doivent fonctionner.

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Citation Envoyé par ZaaN Voir le message
    aaaarg ca change absoluement rien
    Tu dois pouvoir faire ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CheckFunction<COperation> F1 = (CheckFunction<COperation>)Delegate. CreateDelegate(typeof(CheckFunction<COperation>), method);
    Mais ce n'est peut être plus assez abstrait.

    J'avais lu qq part que les designers de C# faisaient très gaffe avec la variance et contravariance, parce que ça pouvait très mal supporter le passage d'un framework à l'autre.

    i.e. si le fx propose en version 1.0 une méthode System.f(double d), puis rajoute une méthode f(int i) en version 2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    delegate void Truc(double d);
    Truc t = System.f; // vaudrait f(double) en v1 et f(int) en v2 si les delegates supportaient la variance
    D'où l'intérêt des contraintes et du mot clé where, à ce que j'ai compris.

  8. #8
    Membre éclairé Avatar de ZaaN
    Inscrit en
    Novembre 2005
    Messages
    819
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 819
    Par défaut
    alors j explique

    un programmeur devra codé des fonctions respectant un certain delegate et les décorée avec un attribut derivé de "ACheckSelector". Le but etant de verifier les fonction codée par les programmeures (si correpond au delegate) et d'executé à la demande ,les fonctions qui possedent un certain attribut

    le delegate :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    protected delegate bool CheckFunction(ICheckable _ObjectToCheck);
    l'attribut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    [AttributeUsage(AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
        public abstract class ACheckSelector : Attribute
        { }
    Ensuite mon programme va verifier (1X) si les fonction decorée correspondes bien au delegate.
    Actuellement, dans cette fonction l'exeption est levée dans tout les cas et c'est pas ce que je veux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    protected void VerifyCheckMethods(ACheckSelector _Selector)
    {
        foreach (var method in this.GetType().GetMethods(GetBindingsFlags()))
        {
            foreach (var attribute in method.GetCustomAttributes(true).Where(att => att.GetType().IsSubclassOf(_Selector.GetType())))
            {
                Console.Write(method);
                try
                {
                    CheckFunction F1 = (CheckFunction)Delegate.CreateDelegate(typeof(CheckFunction), method);
     
                    Console.WriteLine("   OK");//fonction ok
                }
                catch (Exception _exp)
                {
                    Console.WriteLine("   KO");//fonction respecant pas le delegate
                }
            }
        }
    }
    Ensuite les fonctions seront invoquées.

    Exemple de fonction qui sera codée par la suite : (avec l'attribut derivant de ACheckSelector)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    [CheckAxisSegment]
    protected bool CommonCheckAxisSeg(ICheckable  _SegmentToCheck)
    {
        Debug.WriteLine("CommonCheckAxisSeg");
        return true;
    }

Discussions similaires

  1. Erreur HttpWebResponse me renvoi une exception
    Par jubourbon dans le forum Framework .NET
    Réponses: 4
    Dernier message: 16/02/2012, 10h11
  2. erreur :"une exception s'est produite"
    Par leborg dans le forum ASP
    Réponses: 11
    Dernier message: 02/03/2004, 15h09
  3. [JSP] Affichage numéro de ligne d'une exception
    Par PhoneKilleR dans le forum Servlets/JSP
    Réponses: 12
    Dernier message: 23/09/2003, 14h59
  4. Réponses: 2
    Dernier message: 28/08/2003, 00h00
  5. Réponses: 3
    Dernier message: 01/11/2002, 14h30

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