Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Appel d'une fonction par variable

8 réponses
Avatar
Fabian Vilers
Bonjour à tous,

Imaginons une variable de type string contenant "coucou". J'ai également une
fonction membre apellée coucou(). Est-il possible de faire un appel à cette
fonction via la variable?

string function = "coucou";
string ret = function();

string coucou()
{
return("aurevoir");
}

Merci de votre aide

8 réponses

Avatar
Patrick Philippot
Bonjour,

Imaginons une variable de type string contenant "coucou". J'ai
également une fonction membre apellée coucou(). Est-il possible de
faire un appel à cette fonction via la variable?



Non. La meilleure approche, si vous tenez à utiliser une chaîne, serait
de créer une variable de type delegate qui pointe vers la fonction en
question et d'associer ce delegate à une chaîne de caractères dans une
HashTable. Quand vous voulez exécuter la fonction, vous retrouvez le
delegate en vous servant de la chaîne comme clé d'entrée dans la
HashTable. Vous exécutez la fonction via le delegate. C'est propre et
sans risque.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Avatar
Remi Thomas - MVP
"Fabian Vilers" écrivit
Bonjour à tous,

Imaginons une variable de type string contenant "coucou". J'ai également
une fonction membre apellée coucou(). Est-il possible de faire un appel à
cette fonction via la variable?

string function = "coucou";
string ret = function();

string coucou()
{
return("aurevoir");
}




Bonjour,

Les mécanismes de reflexion de .NET peuvent te permettre d'avoir cette
mécanique.
Regarde l'exemple de code ici, il faut t'en inspirer.
http://www.c2i.fr/code.aspx?IDCodeY0

Rémi

--
Rémi Thomas - MVP Visual C++
Développeur Windows indépendant
http://www.xtware.com/cv
Avatar
Fabian Vilers
> Non. La meilleure approche, si vous tenez à utiliser une chaîne, serait
de créer une variable de type delegate qui pointe vers la fonction en
question et d'associer ce delegate à une chaîne de caractères dans une
HashTable. Quand vous voulez exécuter la fonction, vous retrouvez le
delegate en vous servant de la chaîne comme clé d'entrée dans la
HashTable. Vous exécutez la fonction via le delegate. C'est propre et sans
risque.



Merci pour cette réponse rapide. Après avoir posté ma question, je m'étais
effectivement tourné vers les delegates. Dans mon premier post, j'avais
simplifié le problème afin de l'expliquer clairement. Dans le cas qui me
préoccupe, j'ai en fait plusieurs fonctions succeptibles d'etre apellées. Je
ne maitrise pas vraiment les delegates; dois-je un créer un pour chaque
fonction qui pourrait etre apellée?
Avatar
Faust
/Dans son message précédent, _Fabian Vilers_ a écrit/ :
Non. La meilleure approche, si vous tenez à utiliser une chaîne, serait
de créer une variable de type delegate qui pointe vers la fonction en
question et d'associer ce delegate à une chaîne de caractères dans une
HashTable. Quand vous voulez exécuter la fonction, vous retrouvez le
delegate en vous servant de la chaîne comme clé d'entrée dans la HashTable.
Vous exécutez la fonction via le delegate. C'est propre et sans risque.



Merci pour cette réponse rapide. Après avoir posté ma question, je m'étais
effectivement tourné vers les delegates. Dans mon premier post, j'avais
simplifié le problème afin de l'expliquer clairement. Dans le cas qui me
préoccupe, j'ai en fait plusieurs fonctions succeptibles d'etre apellées. Je
ne maitrise pas vraiment les delegates; dois-je un créer un pour chaque
fonction qui pourrait etre apellée?



un pour chaque "schéma" de fonction oui

--
Mephitiquement votre,
Faust
ICQ #161252577
Avatar
Patrick Philippot
Fabian Vilers wrote:
dois-je un créer un pour chaque fonction qui pourrait etre
apellée?



Un delegate par signature. Il peut pointer vers des fonctions variant
dans le temps à condition qu'elles aient toutes la même signature.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Avatar
Patrick Philippot
Salut Rémi,

Les mécanismes de reflexion de .NET peuvent te permettre d'avoir cette
mécanique.
Regarde l'exemple de code ici, il faut t'en inspirer.
http://www.c2i.fr/code.aspx?IDCodeY0



Effectivement, les APIs de réflexion peuvent permettre de mettre un tel
mécanisme en oeuvre :

string MaChaine = "MaMethode";
MonObjet.GetType().GetMethod(MaChaine).Invoke(MonObjet, null);
Mais je trouve ça trop coûteux. Le mapping chaîne -> delegate est a
priori plus performant, je pense. De plus, si la chaîne ne représente
pas un nom de fonction existant, il faudra gérer les exceptions
générées. Alors que si on fait le mapping NomMethode -> Delegate, on
peut tester avec ContainsKey si la fonction existe avant de tenter une
exécution: a priori, on n'aura utilisé comme clé que des noms de
fonctions existantes.

Mais je dois avouer que je n'ai pas fait de mesures précises sur les
performances.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Avatar
Patrick Philippot
Patrick Philippot wrote:
Effectivement, les APIs de réflexion peuvent permettre de mettre un
tel mécanisme en oeuvre :



Tiens, il y aussi une autre page intéressante sur le sujet:
http://samples.gotdotnet.com/quickstart/howto/doc/Invoke.aspx

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Avatar
Fabian Vilers
> Un delegate par signature. Il peut pointer vers des fonctions variant
dans le temps à condition qu'elles aient toutes la même signature.



Encore merci pour ces infos. Je vais voir comment implémenter tout ca, je
n'ai que 2 jours de C# d'expérience... Actuellement, je fait un truc
horrible avec un switch et j'apelle la fonction adéquate avec les bons
paramètres.