Comment puis-je passer d'un événement à une fonction en C#?
Je suis à la recherche pour passer d'un événement à une fonction d'assistance. Cette fonction permettra de fixer une méthode pour l'événement. Cependant, j'ai du mal à correctement passant l'événement. J'ai essayé de passer un EventHandler<TEventArgs>
. Il compile, mais les événements ne sont pas attachés (mais sont encore ajouté; il semble qu'une copie du gestionnaire d'événements est faite).
Par exemple, si j'ai ceci:
public event EventHandler<EventArgs> MyEvent;
Et la fonction d'assistance:
public static void MyHelperFunction<TEventArgs>(EventHandler<TEventArgs> eventToAttachTo)
{
eventToAttachTo += (sender, e) => { Console.WriteLine("Hello world"); };
}
Et l'appelant:
MyHelperFunction(MyEvent);
MyEvent(null, new EventArgs()); //Does nothing.
- Pourriez-vous élaborer un peu sur les détails de la façon dont vous avez été en utilisant ce? Je trouve cette question très intéressante, mais je vais avoir de la difficulté à voir le cas d'utilisation.
- Feminella, j'ai été la création de certaines fonctions d'assistance, et d'une manière synchrone attend un événement. Ils sont principalement utilisés pour réduire la réutilisation de code pour plusieurs WaitFor méthodes (par exemple, WaitForConnected) dans mes classes pour le réseau (qui s'est opéré de manière asynchrone).
Vous devez vous connecter pour publier un commentaire.
La raison pour laquelle cela ne fonctionne pas est de += lorsqu'il est appliqué à un délégué crée un nouveau délégué qui est la combinaison de l'ancien et le nouveau. Il ne modifie pas le déléguer.
Afin d'obtenir que cela fonctionne, vous devrez passer par le délégué de référence.
La raison pour laquelle cela fonctionne en dehors de la méthode est parce que le membre de GAUCHE est encore le champ réel. Donc += va créer un nouveau délégué et affecter retourner au champ de membre.
Juste venu avec ce petit assistant. Si il est de votre auto-Événement créé, vous pouvez utiliser un wrapper de ce genre. Vous pouvez utiliser votre += opérateurs de joindre les gestionnaires comme normal, mais peut passer le wrapper autour et même d'accroître le cas d'ailleurs.
Créer l'événement comme:
Associer des gestionnaires:
Élever événement:
Juste deviner: Avez-vous essayé de le transmettre comme ref?
Ce n'est pas exactement agréable, mais vous pouvez utiliser la réflexion pour ce faire.
Où eventObject est l'objet contenant l'événement, et eventName est le nom de l'événement.
SetEvent est votre gestionnaire d'événement.
J'ai aussi une méthode dispose comme ceci:
J'ai une solution où j'ai un deux interfaces. La première interface a des méthodes pour la liaison de certains événements, tandis que l'autre interface a méthodes d'événement qui peut être lié à ces événements.
La première interface de lier les méthodes prend la deuxième interface comme paramètre, ce qui permet de lier les événements dans le méthodes de toute classe qui implémente la deuxième interface.
Est que compréhensible, ou préférez-vous un peu de code? 🙂
Comme beaucoup l'ont souligné, en passant par un événement, une méthode n'est pas possible ou n'est pas simple.
Préciser, mais je soupçonne votre usage prévu ressemblera à quelque chose comme:
Vous pouvez accomplir cela tout simplement en faisant votre générique des gestionnaires d'événements accessibles publiquement (ou l'intérieur, si vous le désirez):
Dans cet exemple, mon fourre-tout gestionnaire est dans une classe statique, mais vous pouvez tout aussi bien utiliser une non-statique de la classe. Aussi, je vois que dans votre exemple, vous avez fait la méthode générique (TEventArgs). Parce que tout ce Gestionnaire de produits dérivés (tels que CancelEventHandler) correspondent à la base de ce Gestionnaire, vous n'avez pas besoin d'impliquer les génériques (il ne serait pas utile).
Si l'enregistrement logique est complexe ou que vous devez garder le Gestionnaire privé, envisagez d'utiliser les Événements de l'Interface. Cela peut ne pas répondre à votre objectif de réduire la quantité de code, mais il vous permettra de créer une classe qui peut, de manière prévisible, gérer tous les événements d'un type spécifique.
Passer quelque chose comme l'Action e = e => myevent += e;
Et l'appel de méthode avec le gestionnaire? Il a l'avantage de travailler avec .NET classes.