Reflection, fonction et évènements

Signaler
Messages postés
2
Date d'inscription
jeudi 6 juillet 2006
Statut
Membre
Dernière intervention
7 juillet 2006
-
Messages postés
2
Date d'inscription
jeudi 6 juillet 2006
Statut
Membre
Dernière intervention
7 juillet 2006
-
Bonjour,


Je vous écris pour essayer de résoudre un petit problème en c#.


L'idée générale de se problème est :


J'ai une

classe A{


event EntreeHandler Entree;

delegate object EntreeHandler(object[] obj);

}


et une classe B{

string Sortie(string s){...}

}


Je voudrais pouvoir matcher mon event et sa fonction associée, et ce de
manière dynamique en utilisant les possibilités de Reflexivité de c#.
J'ai sais que a priori il n'est pas possible de matcher un évènement et
une fonction si elle ne sont pas exactement de même type, mais n'y a t
il pas moyen détourné de faire une telle manip ?


Quelqu'un pourrait-il m'aider dans ce défit, car je ne suis ps un trés trés grand spécialiste de C#.


Par réflexion, je suis déjà parvenu à matcher l'évent et la fonction à
exécuter lorsqu'ils possèdent exactement la même signature (cf
CSharp.cs , méthode link_not_generic).


Je vous remercie d'avance


Les pieces jointes sont (aussi) ici:
http://www.essi.fr/~bianco/prog/CSharp.cs
http://www.essi.fr/~bianco/prog/container.zip

2 réponses

Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
37
tu peux toujours créer dans ta classe B une méthode comme ceci :

string Sortie(object[] obj) {
    return Sortie((string)obj[0]);
}

Sébastien FERRAND (
blog)
Consultant Indépendant
[Microsoft MVP Visual C#]
Messages postés
2
Date d'inscription
jeudi 6 juillet 2006
Statut
Membre
Dernière intervention
7 juillet 2006

Le problème est que tout est dynamique, et je ne veux donc ni toucher à la classe A, ni toucher à la classe B mais modifier le code qui fait la liaison entre les deux en utilisant la réflexion (voilà ce que je fais lorsque les signatures de Event et la méthode cible sont identiques) :

private void link_not_generic(String id, EventInfo _ei, MethodInfo _mi)
        {
            //récupération du type du handler de l'event
            Type te = _ei.EventHandlerType;

            //récupération de son contructeur
            ConstructorInfo ci = te.GetConstructors()[0];
           
            //création du pointeur sur la fonction cible
            IntPtr destPtr;           
            destPtr = _mi.MethodHandle.GetFunctionPointer();                  

            //on récupère la méthode qui permet d'ajouter un gestionnaire d'évènement à un évènement
            MethodInfo miadd = _ei.GetAddMethod();

            object eventH;          
            try
            {
                //On invoque dynamiquement le contrsucteur de EventHandler
                eventH = ci.Invoke(new object[]{ot, destPtr});
                //on ajoute dynamiquement un hanler
                miadd.Invoke(os,new object[]{eventH});
            }
            catch(Exception e)
            {
                Console.WriteLine("Error: "+e.Message);
                return;
            }
}