Ao programar eventos em C #, é recomendável criar um delegado na forma de:
delegate XEventHandler(object sender, XEventArgs e);
Minha pergunta está no primeiro argumento do delegado object sender,. Sempre tem que ser genérico object? Ter um remetente do tipo objectsempre resulta em código semelhante a este.
val = ((ConcreteType)sender).Property;
ou, ainda mais detalhado,
ConcreteType obj = sender as ConcreteType
if (obj != null) { ... }
Um argumento contra remetentes fortemente tipados é que outros objetos podem encaminhar o evento sem se preocupar com o tipo. Embora isso possa fazer sentido em ambientes de GUI, não tenho certeza se isso pode se beneficiar fora de uma GUI.
E se a classe do remetente for sempre conhecida (pelo menos como uma classe abstrata)? Por exemplo, se estou implementando um ListChangedevento em uma Listclasse abstrata , e se outras classes vão herdá-lo (por exemplo LinkedList, ArrayList), está certo definir meu delegado com um remetente do tipo List?
delegate ListChangedEventHander(List sender, ListChangedEventArgs e);
Ou haveria uma desvantagem em mudar o convencional object senderpara um tipo mais específico?