Estoy bastante contento con mi comprensión del modelo de eventos .NET. Creo que podría estar malinterpretando un pequeño matiz del sistema.
Cuando comencé a poner eventos en mis clases, usaría la forma estándar de esta manera:
public event EventHandler<MyEventArgs> MyEvent;
Esto significaba que cualquier cosa que se suscribiera al evento necesitaría un método como:
void HandleThatEvent(object sender, MyEventArgs args){...}
Lo cual es bueno, pero descubrí que rara vez me importaría el remitente, por lo que hizo que se hincharan muchas firmas de métodos.
Entonces cambié a declarar mis propios tipos de delegado
public delegate void MyEventHandler(SomeClass argument);
Lo que redujo el desorden, pero me dejó con un pequeño problema a la hora de escribir controladores:
eventImplmentor.MyEvent += HandleThatEvent;
.
.
.
void HandleThatEvent(/*oh, um, what arguments does it take? Intellisense isn't telling me*/)
Así que tendría que volver a la declaración del delegado y mirar y luego regresar y escribirlos, o compilarlo y esperar a que me lo digan.
Entonces, en cambio, solo estoy usando Action, Action<T>o cualquier plantilla que se ajuste.
public event Action<SomeClass> MyEvent;
Para que pueda pasar el cursor sobre el evento y que me digan qué parámetros espera.
Mi pregunta, después de todo eso: ¿hay una mejor práctica para declarar eventos en C #? ¿Debo volver al EventHandler<T>camino, o es Action<T>aceptable?