delegate + string name method

delegate + string name method - C#/.NET managed - Programmation

Marsh Posté le 16-07-2010 à 14:53:24    

Bonjour,  
 
j'aimerais avoir un dispatcher pour déléguer l'appel de mes fonctions.
Le seul petit problème que j'ai est de récupérer la méthode. Je me demandais si il était indispensable de passer par une classe de GetByName (je ne trouve pas ça super propre).
 
J'aimerais à la base faire de la manière suivante :
 

Code :
  1. // Delegate edition function
  2. private delegate void callEdit();
  3. private callEdit editFunction;


 
Puis dans mon dispatcher directement :

Code :
  1. editFunction = new callEdit(action);
  2.  editFunction();


 
Pourriez vous me dire si cela peut être fait directement ou bien si je dusses passer par un Object Fonctionnel.
 
Merci.


---------------
“L'éducation est l'arme la plus puissante que l'on puisse utiliser pour changer le monde”
Reply

Marsh Posté le 16-07-2010 à 14:53:24   

Reply

Marsh Posté le 16-07-2010 à 15:37:50    

Je voulais éviter un exemple pas très propre mais qui montre ce que je voudrais mettre en place :
 

Code :
  1. public void Edit(string action)
  2. {
  3.  switch(action)
  4.   {
  5.      case "Hide":
  6.          editFunction = new callEdit(HideObjects);
  7.         break;
  8.       case "Show":
  9.          editFunction = new callEdit(ShowObjects);
  10.          break;
  11.       default:
  12.          Debug.Log("Fonction inexistante" );
  13.          return;
  14.    }
  15.  
  16.    editFunction();
  17. }


---------------
“L'éducation est l'arme la plus puissante que l'on puisse utiliser pour changer le monde”
Reply

Marsh Posté le 16-07-2010 à 15:39:20    

Quelle version de C#? Also, switchDégueuxG [:sadnoir]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 16-07-2010 à 15:57:08    

C'est bien pour ça que je veux éviter ... version 2.5.


---------------
“L'éducation est l'arme la plus puissante que l'on puisse utiliser pour changer le monde”
Reply

Marsh Posté le 16-07-2010 à 16:07:26    

kirua_sama a écrit :

C'est bien pour ça que je veux éviter ... version 2.5.


Ya pas de C# 2.5 :o

 


Ya pas non plus de C# 3.5 :o

 

En quoi ça va l'aider?

Message cité 1 fois
Message édité par masklinn le 16-07-2010 à 16:08:37

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 16-07-2010 à 16:15:48    


Et .Net 4 et C# 4, qui a enfin intégré plein de features sympas pour ce genre de conneries :o

 

Que sa solution actuelle est moche (et qu'il a probablement des problèmes de types)?


Message édité par masklinn le 16-07-2010 à 16:15:55

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 16-07-2010 à 16:16:48    

Le problème est de ne pas avoir à faire ces chose immonde ^^.
Je voulais dire 2.0, pardon.
 
Edit pas de probleme de type, mais ça ne saurait tarder étant donné le code actuel.


Message édité par kirua_sama le 16-07-2010 à 16:17:44

---------------
“L'éducation est l'arme la plus puissante que l'on puisse utiliser pour changer le monde”
Reply

Marsh Posté le 16-07-2010 à 16:22:44    

Bon maintenant ton Edit marche comment au niveau de l'appel? Parce que là en regardant ton dispatcher, je vois pas du tout l'intérêt de créer un delegate, tu peux juste appeler tes méthodes. Les delegates, c'est pour passer des fonctions en paramètre ou en valeur de retour avec les vieilles versions de C#, je vois pas quel besoin il y a pour ça ici.


Message édité par masklinn le 16-07-2010 à 16:23:33

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 16-07-2010 à 16:28:54    

A la base j'avais créer mon delegate justement en esperant ne pas avoir à faire cela mais directement caster le string action en method name -- pensant qu'il y aurait une résolution de nom disponible et autommatique :). C'est un peu le sens de ma question.


---------------
“L'éducation est l'arme la plus puissante que l'on puisse utiliser pour changer le monde”
Reply

Marsh Posté le 16-07-2010 à 16:30:02    

Avec quelque chose du genre :
editFunction = new callEdit((ValueDelegate)action);

 

Edit : désoler pour le double post, je pensais déjà être en dit.


Message édité par kirua_sama le 16-07-2010 à 16:36:46

---------------
“L'éducation est l'arme la plus puissante que l'on puisse utiliser pour changer le monde”
Reply

Marsh Posté le 16-07-2010 à 16:30:02   

Reply

Marsh Posté le 16-07-2010 à 16:39:45    

kirua_sama a écrit :

A la base j'avais créer mon delegate justement en esperant ne pas avoir à faire cela mais directement caster le string action en method name -- pensant qu'il y aurait une résolution de nom disponible et autommatique :). C'est un peu le sens de ma question.


C'est bizarre et dangereux ton truc, si le nom de méthode est pas bon ça te pête à la gueule, et si c'est une méthode privée tu vas potentiellement leaker des données, exploser en plein vol ou foutre ton objet dans un état inconsistant.

 

Enfin bon, si tu veux faire un truc pareil, faut pas utiliser des delegates, faut utiliser de l'introspection. Ici, InvokeMember


Message édité par masklinn le 16-07-2010 à 16:39:52

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 16-07-2010 à 16:41:22    


Chuis pas sûr que ça fonctionne en 2.0, les delegates implicites. Son initialisation explicite est parfaitement valable, c'est surtout que créer un delegate ne sert strictement à rien si tu l'appelles juste après.

 

Sauf si tu utilises un multicast delegate à la limite.

Message cité 1 fois
Message édité par masklinn le 16-07-2010 à 16:44:26

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 16-07-2010 à 16:48:29    

Merci; mais l'introspection ne corresponds pas à ce dont j'ai besoin ^^. Pas besoin de late binding pour le coup ...  
Par contre j'avais penser au problème de nom de méthode et je pensais que justement j'aurais pu récupérer facilement des exceptions envoyer le resolver ^^.  
 

Citation :


#
public void Methode1()
#
{
#
}
#
 
#
public void Start()
#
{
#
  editFunction = Methode1;
#
  editFunction();
#
}


 
Du coup pour faire un dispatcher tu utiliserais aussi un switch, je me trompe ?
 
... du coup bien que sale, le switch semble encore être ce qui est le plus envisageable en l'état.
 
Edit : En supprimant du coup le delegate qui ne fait pas ce que j'aurais aimer et appeller directement mes méthodes du switch :jap:  

Message cité 2 fois
Message édité par kirua_sama le 16-07-2010 à 16:49:43

---------------
“L'éducation est l'arme la plus puissante que l'on puisse utiliser pour changer le monde”
Reply

Marsh Posté le 16-07-2010 à 17:00:17    


 
 
Oui merci pour la réponse ^^, vous avez répondu à mon questionnement premier à savoir si ça existait directement avec une bonne gestion (je suivrais C# 4.0).
Sinon effectivement vais me contenter d'un switch, car le virtual ne convient pas à mon problème dans le contexte.  
 
Je vous remercie :jap: .


Message édité par kirua_sama le 16-07-2010 à 17:00:42

---------------
“L'éducation est l'arme la plus puissante que l'on puisse utiliser pour changer le monde”
Reply

Marsh Posté le 16-07-2010 à 17:17:40    


Le résultat est le même :o
 
Mouais. Ç'est tordu et aucun des exemples ne ressemble à ça, quand même :o


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 16-07-2010 à 17:18:46    

kirua_sama a écrit :

Merci; mais l'introspection ne corresponds pas à ce dont j'ai besoin ^^. Pas besoin de late binding pour le coup ...


Mais de quoi tu parles? Tu veux invoquer une méthode en ayant son nom dans une chaîne, c'est exactement ce que fait InvokeMember, que vient foutre le late binding là dedans?

kirua_sama a écrit :

Sinon effectivement vais me contenter d'un switch, car le virtual ne convient pas à mon problème dans le contexte.


On ne sait toujours pas ce que sont le problème ou le contexte, en attendant :/


Message édité par masklinn le 16-07-2010 à 17:19:54

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 16-07-2010 à 17:33:24    

:o -- Vais documente un petit peu plus pour le coup.


Message édité par kirua_sama le 16-07-2010 à 17:33:42

---------------
“L'éducation est l'arme la plus puissante que l'on puisse utiliser pour changer le monde”
Reply

Marsh Posté le 20-07-2010 à 16:27:26    

Le contexte est assez contraignant en fait car c'est du développement avec le moteur de jeu Unity3D. A partir d'une liste de boutons définis par des graphistes, je dois créer automatiquement des menu et les liées à des actions prédéfinis qui reposent donc sur un nommage strict. Je voulais à la base utiliser le "delegate" justement pour cette liaison automatique. Je pense en effet que le Type.Invoke répondrais parfaitement à ma problématique et serais parfais aussi pour le multilingue en ajoutant simplement une méthode translate à chacun de mes objet actionnable (Le design n'étant pas séparer proprement du code --> Le nom d'un préfab correspond à la ref de l'object et ce même nom est utiliser pour la liaison de la méthod correspondant à une action sur un boutton). Le contexte est un petit peu particulier... Voila, je vous remercie encore.
 
Edit : Ce n'est pas 40 pages, mais en gros y'a beaucoup de contraintes avec ce qui est en place.


Message édité par kirua_sama le 20-07-2010 à 16:27:55

---------------
“L'éducation est l'arme la plus puissante que l'on puisse utiliser pour changer le monde”
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed