J'ai la classe suivante, qui a un événement public appelé LengthChanged code>:
Foo foo = ...;
Dimension dim = ...;
foo.Observer (dim.LengthChanged);
3 Réponses :
Malheureusement, il n'y a pas vraiment un moyen de faire cela. Les événements ne sont pas des citoyens de première classe à .NET en général - bien que f # essaie de les promouvoir là-bas. P>
transmettez-vous dans le délégué de souscription / désabonnement ou à l'aide d'une chaîne indiquant le nom de l'événement. (Ce dernier est souvent plus court, mais manifestement moins sûr à la compilation.) P>
Ce sont les approches qui Extensions réactives prend - s'il y avait un nettoyant façon de le faire, je suis sûr qu'ils utiliseraient cela: ( p>
Si des personnes comme Erik Meijer n'étaient pas capables de trouver des solutions plus propres, je soupçonne qu'en effet, il n'y a pas d'autre moyen de le faire. C'est triste ... merci pour votre réponse rapide, Jon.
L'événement n'est pas censé être transmis dans une autre méthode. Cependant, vous pouvez transmettre un délégué à une autre méthode. Peut-être que ce que vous recherchez ne sont peut-être qu'un simple délégué public au lieu de l'événement.
Si vous modifiez votre événement en ce p>
Foo foo = ...; Dimension dim = ...; foo.Observer (dim.LengthChanged);
Merci pour votre suggestion. Non, je ne peux pas passer le délégué au lieu de l'événement; L'événement peut implémenter le Ajouter code> et
Supprimer code> doit être défini comme un événement C # COD> complet CODE>.
@Pierre je vois .. Dans ce cas, ce que je ferais, c'est de déclarer une classe d'emballage de délégué. Le constructeur de cette classe prend un délégué. La classe a Virtual Addhandler () et Virtual SupprimerHandler (). Il a également une méthode invoke () pour appeler le délégué. Pour que cela ait l'air plus élégant, vous pouvez définir l'opérateur + =, - =, + et -, appeler votre addhandler et retirerHandler. Remplacez votre événement de longueur de votre dimension par cette classe wrapper. Pour le cas, vous avez besoin de "Ajouter" et "Supprimer" Setteurs, il suffit de remplacer les méthodes Addhandler et RetirHandler de la classe Wrapper. Juste mes 2 cents. J'ai fait des semblables.
Belle solution ... Je vais devoir le penser. +1 pour ce joli hack.
Vous pouvez créer un accesseur personnalisé.
public event EventHandler NewEvent { add { Dimension.LengthChanged += value; } remove { Dimension.LengthChanged -= value; } }