Appelle d'une méthode en ne connaissant que son nom [Résolu]

Signaler
Messages postés
1182
Date d'inscription
mercredi 21 janvier 2004
Statut
Membre
Dernière intervention
6 septembre 2011
-
Messages postés
1182
Date d'inscription
mercredi 21 janvier 2004
Statut
Membre
Dernière intervention
6 septembre 2011
-
hello tout le monde,

je cherche à générer un menu de maniere dynamique en fonction des données stockées dans une de mes tables.
je stock dans ma table le nom de la méthode à appeler
seulement voila c'est du string alors que dans mon :

string clic = "message()";

nomMenu.Click += new System.EventHandler(clicl);


il attend une méthode donc forcement...

j'ai donc essayer un truc style :

string clic = "message()";

Type v_Type=Type.GetType("Form1",true,false);

v_Type.GetMethod(clic).Invoke(v_Type,new Object[] {});


recuperer ici : http://www.csharpfr.com/code.aspx?ID=11444

mais je ne m'en sors pas...

kkun a un moyen ???

Arthenius

"Ce qui ne me tue pas, me rend plus fort..."

8 réponses

Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
85
j'ai utiliser :
public static Delegate CreateDelegate(
   Type type,
   object target,
   string method
);


target : The class instance on which method is invoked.

toi tu lui passe nomMenu, que je suppose etre ton instance de MainMenu ou ContextMenu
hors ta methode n'est pas definie dans la classe du menu, mais dans ton form, donc tu dois lui passer l'instance du form

et aussi
public void AddEventHandler(
   object target,
   Delegate handler
);

target : The event source.
et toi tu lui passe this, c'est a dire le form : donc tu defini l'event Click du Form et non celui du MenuItem

Cocoricoooooooo !!!!
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
85
tu peux faire ça :
string method = "Methode";
MethodInfo minfo = this.GetType().GetMethod(method);
minfo.Invoke(this, null);


il me semble que la methode en question doit etre public

enfin sur ce coup là je ne suis pas sûr de comprendre ce que tu veux faire au juste

Cocoricoooooooo !!!!
Messages postés
1182
Date d'inscription
mercredi 21 janvier 2004
Statut
Membre
Dernière intervention
6 septembre 2011
13
le but ultime est de générer un menu en fonction des utilisateurs...

donc ajouter en dynamique les méthodes a appeler sur le click du menu...

je vais tester ton code

merci..

Arthenius

"Ce qui ne me tue pas, me rend plus fort..."
Messages postés
1182
Date d'inscription
mercredi 21 janvier 2004
Statut
Membre
Dernière intervention
6 septembre 2011
13
le invoke en fait il exceutte direct la méthode c ca ???

moi j'aimerais faire un abonnement a une méthode en passant par le nom de cette méthode que je stocke en string

grosso modo je voudrais reussir a transformer mon string en méthode que je pourrais excuter sur le clik du menu

string monnomdemethode="clic";

....code qui permet de trouver la méthode ayant pour nom monnomdemethode.....et qui l'affecte a mamethodeclick....

nomMenu.Click += new System.EventHandler(MamethodeClick);


sais pas si g ete + clair....
:-p

Arthenius

"Ce qui ne me tue pas, me rend plus fort..."
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
85
plutot marrante ton idée ^^

ce code devrait faire l'affaire :
string method = "Methode";
EventInfo einfo = this.GetType().GetEvent("Click");
einfo.AddEventHandler(
this.button2, 
Delegate.CreateDelegate(einfo.EventHandlerType, this, method)
);


Cocoricoooooooo !!!!
Messages postés
1182
Date d'inscription
mercredi 21 janvier 2004
Statut
Membre
Dernière intervention
6 septembre 2011
13
merci jva voir ca... :o))

tu aurais fait differement pour generer un menu dynamiquement en fonction d'un utilisateur ???

Arthenius

"Ce qui ne me tue pas, me rend plus fort..."
Messages postés
1182
Date d'inscription
mercredi 21 janvier 2004
Statut
Membre
Dernière intervention
6 septembre 2011
13
j'ai fait :

string method = "message";

EventInfo einfo = nomMenu.GetType().GetEvent("Click");

einfo.AddEventHandler(

this, 

Delegate.CreateDelegate(einfo.EventHandlerType, nomMenu, method)

);


et j'obtiens erreur de liaison avec la méthode cible ???

Arthenius

"Ce qui ne me tue pas, me rend plus fort..."
Messages postés
1182
Date d'inscription
mercredi 21 janvier 2004
Statut
Membre
Dernière intervention
6 septembre 2011
13
Ok ca fonctionne autant pour moi :

voila le code final :
string method = "message";

EventInfo einfo = nomMenu.GetType().GetEvent("Click");

einfo.AddEventHandler(

nomMenu, 

Delegate.CreateDelegate(einfo.EventHandlerType, this, method)

);

 

public void message(object sender, System.EventArgs e)

{

MenuItem item = (MenuItem)sender;

MessageBox.Show(item.Text, "Fenetre affichée après clic", MessageBoxButtons.OK, MessageBoxIcon.Information);

}

 


merci coq

Arthenius

"Ce qui ne me tue pas, me rend plus fort..."