Je suis tombé sur une situation où j'avais besoin de traiter avec un Delegate
en interne, mais je voulais une contrainte générique. Plus précisément, je voulais ajouter un gestionnaire d'événement à l'aide de la réflexion, mais je voulais utiliser un argument générique pour le délégué. Le code ci-dessous ne fonctionne PAS, depuis le "Gestionnaire" est un type de variable, et que le compilateur n'a pas coulé Handler
de Delegate
:
public void AddHandler<Handler>(Control c, string eventName, Handler d) {
c.GetType().GetEvent(eventName).AddEventHandler(c, (Delegate) d);
}
Toutefois, vous pouvez passer d'une fonction qui fait la conversion pour vous. convert
prend un Handler
argument et renvoie un Delegate
:
public void AddHandler<Handler>(Control c, string eventName,
Func<Delegate, Handler> convert, Handler d) {
c.GetType().GetEvent(eventName).AddEventHandler(c, convert(d));
}
Maintenant que le compilateur est heureux. L'appel de la méthode est facile. Par exemple, en joignant à l' KeyPress
événement sur un contrôle Windows Forms:
AddHandler<KeyEventHandler>(someControl,
"KeyPress",
(h) => (KeyEventHandler) h,
SomeControl_KeyPress);
où SomeControl_KeyPress
est la cible de l'événement. La clé est le convertisseur de lambda - il n'a pas de travail, mais il convainc le compilateur vous lui avez donné un valide délégué.
(Commencer 280Z28) @Justin: Pourquoi ne pas l'utiliser?
public void AddHandler<Handler>(Control c, string eventName, Handler d) {
c.GetType().GetEvent(eventName).AddEventHandler(c, d as Delegate);
}
(Fin 280Z28)