Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1661 connectés 

  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  delegate + string name method

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

delegate + string name method

n°2009512
kirua_sama
Learn sciences with senses
Posté le 16-07-2010 à 14:53:24  profilanswer
 

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”
mood
Publicité
Posté le 16-07-2010 à 14:53:24  profilanswer
 

n°2009534
kirua_sama
Learn sciences with senses
Posté le 16-07-2010 à 15:37:50  profilanswer
 

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”
n°2009536
masklinn
í dag viðrar vel til loftárása
Posté le 16-07-2010 à 15:39:20  profilanswer
 

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
n°2009540
kirua_sama
Learn sciences with senses
Posté le 16-07-2010 à 15:57:08  profilanswer
 

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”
n°2009546
masklinn
í dag viðrar vel til loftárása
Posté le 16-07-2010 à 16:07:26  profilanswer
 

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
n°2009551
masklinn
í dag viðrar vel til loftárása
Posté le 16-07-2010 à 16:15:48  profilanswer
 


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
n°2009552
kirua_sama
Learn sciences with senses
Posté le 16-07-2010 à 16:16:48  profilanswer
 

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”
n°2009558
masklinn
í dag viðrar vel til loftárása
Posté le 16-07-2010 à 16:22:44  profilanswer
 

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
n°2009565
kirua_sama
Learn sciences with senses
Posté le 16-07-2010 à 16:28:54  profilanswer
 

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”
n°2009568
kirua_sama
Learn sciences with senses
Posté le 16-07-2010 à 16:30:02  profilanswer
 

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”
mood
Publicité
Posté le 16-07-2010 à 16:30:02  profilanswer
 

n°2009573
masklinn
í dag viðrar vel til loftárása
Posté le 16-07-2010 à 16:39:45  profilanswer
 

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
n°2009574
masklinn
í dag viðrar vel til loftárása
Posté le 16-07-2010 à 16:41:22  profilanswer
 


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
n°2009580
kirua_sama
Learn sciences with senses
Posté le 16-07-2010 à 16:48:29  profilanswer
 

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”
n°2009589
kirua_sama
Learn sciences with senses
Posté le 16-07-2010 à 17:00:17  profilanswer
 


 
 
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”
n°2009591
masklinn
í dag viðrar vel til loftárása
Posté le 16-07-2010 à 17:17:40  profilanswer
 


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
n°2009592
masklinn
í dag viðrar vel til loftárása
Posté le 16-07-2010 à 17:18:46  profilanswer
 

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
n°2009605
kirua_sama
Learn sciences with senses
Posté le 16-07-2010 à 17:33:24  profilanswer
 

: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”
n°2010425
kirua_sama
Learn sciences with senses
Posté le 20-07-2010 à 16:27:26  profilanswer
 

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”
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  delegate + string name method

 

Sujets relatifs
[DELPHI] Verifier les caractères d'un string !compréhension d'un petit code réécris issus de string.h
Warning: mysqli_escape_string()Writeexcel "could not be converted to string[...]"
Conversion Hexa -> Stringliste incremental string [RESOLU]
String To XMLconversion string to int
[JAVA] mystere de conversion string - byte[ ] [ifstream] Lire des string constantes (fscanf vs >>)
Plus de sujets relatifs à : delegate + string name method


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR