delegate + string name method - C#/.NET managed - Programmation
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 :
|
Marsh Posté le 16-07-2010 à 15:39:20
Quelle version de C#? Also, switchDégueuxG
Marsh Posté le 16-07-2010 à 15:57:08
C'est bien pour ça que je veux éviter ... version 2.5.
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
Ya pas non plus de C# 3.5
En quoi ça va l'aider?
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
Que sa solution actuelle est moche (et qu'il a probablement des problèmes de types)?
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.
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.
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.
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.
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
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.
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 : |
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
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 .
Marsh Posté le 16-07-2010 à 17:17:40
Le résultat est le même
Mouais. Ç'est tordu et aucun des exemples ne ressemble à ça, quand même
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
Marsh Posté le 16-07-2010 à 17:33:24
-- Vais documente un petit peu plus pour le coup.
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.
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 :
Puis dans mon dispatcher directement :
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”