Estou bastante satisfeito com minha compreensão do modelo de evento .NET. Acho que estou entendendo mal uma pequena nuance do sistema.
Quando comecei a colocar eventos em minhas aulas, usaria o modo padrão da seguinte maneira:
public event EventHandler<MyEventArgs> MyEvent;
Isso significava que qualquer coisa que assinasse o evento precisaria de um método como:
void HandleThatEvent(object sender, MyEventArgs args){...}
O que é legal, mas descobri que raramente me importaria com o remetente, por isso muitas assinaturas de método estavam inchadas.
Então mudei para declarar meus próprios tipos de delegados
public delegate void MyEventHandler(SomeClass argument);
O que reduziu a desordem, mas me deixou com um pequeno problema quando se tratava de manipuladores de escrita:
eventImplmentor.MyEvent += HandleThatEvent;
.
.
.
void HandleThatEvent(/*oh, um, what arguments does it take? Intellisense isn't telling me*/)
Então eu teria que voltar para a declaração do delegado e olhar e depois voltar e escrevê-los, ou compilá-lo e esperar para ser informado.
Então agora, em vez disso, estou apenas usando Action, Action<T>ou o modelo que se encaixa.
public event Action<SomeClass> MyEvent;
Para que eu possa passar o mouse sobre o evento e saber quais parâmetros ele espera.
Minha pergunta, depois de tudo isso: Existe uma prática recomendada para declarar eventos em c #? Devo voltar ao EventHandler<T>caminho ou é Action<T>aceitável?