Considerare:La sottoscrizione di un'azione a qualsiasi tipo di evento tramite riflessione
someControl.Click += delegate { Foo(); };
Gli argomenti della manifestazione sono irrilevanti, non ho bisogno di loro e io non sono interessato a loro. Voglio solo Foo() per essere chiamato. Non c'è un modo ovvio per fare lo stesso tramite la riflessione.
mi piacerebbe tradurre il sopra in qualcosa sulla falsariga di
void Foo() { /* launch missiles etc */ }
void Bar(object obj, EventInfo info)
{
Action callFoo = Foo;
info.AddEventHandler(obj, callFoo);
}
Inoltre, io non voglio fare l'ipotesi che il tipo di oggetto passato alla Bar rigorosamente aderisce alle linee guida della utilizzando la firma EventHander (TArgs) per gli eventi. Per dirla semplicemente, sto cercando un modo per iscrivere un'azione a qualsiasi tipo di gestore; meno semplicemente, un modo per convertire il delegato dell'Azione in un delegato del tipo di gestore previsto.
+1 Per lanciare i missili! – Jason
Cosa ti aspetti che succeda se il tipo di delegato utilizzato per l'evento avesse un tipo di reso non vuoto, o un parametro 'out'? –
@JonSkeet Buon punto, non l'ho davvero preso in considerazione; i parametri out e i valori restituiti non sono realmente utili per gli eventi. Ma mi aspetterei un errore di conversione, un'eccezione, ecc. Fondamentalmente mi piacerebbe presumere che quei tipi non sarebbero usati come gestori di eventi per la mia sanità mentale. – Siege