Reflection, fonction et évènements

sebbianco Messages postés 2 Date d'inscription jeudi 6 juillet 2006 Statut Membre Dernière intervention 7 juillet 2006 - 6 juil. 2006 à 19:02
sebbianco Messages postés 2 Date d'inscription jeudi 6 juillet 2006 Statut Membre Dernière intervention 7 juillet 2006 - 7 juil. 2006 à 10:07
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

sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
7 juil. 2006 à 08:58
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#]
0
sebbianco Messages postés 2 Date d'inscription jeudi 6 juillet 2006 Statut Membre Dernière intervention 7 juillet 2006
7 juil. 2006 à 10:07
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;
            }
}
0
Rejoignez-nous