Considere:una acción para cualquier tipo de evento a través de la reflexión
someControl.Click += delegate { Foo(); };
Los argumentos del evento son irrelevantes, no necesito de ellos y no estoy interesado en ellos. Solo quiero que llamen a Foo(). No hay una manera obvia de hacer lo mismo a través de la reflexión.
me gustaría traducir lo anterior en algo en la línea de
void Foo() { /* launch missiles etc */ }
void Bar(object obj, EventInfo info)
{
Action callFoo = Foo;
info.AddEventHandler(obj, callFoo);
}
Además, yo no quiero hacer la hipótesis de que el tipo de objeto que se pasa a Bar se adhiere estrictamente a las directrices de utilizando la firma EventHander (TArgs) para eventos. Para decirlo simplemente, estoy buscando una forma de suscribir una Acción a cualquier tipo de controlador; menos simplemente, una forma de convertir el delegado de Acción en un delegado del tipo de controlador esperado.
+1 Para el lanzamiento de misiles! – Jason
¿Qué esperaría que ocurriera si el tipo de delegado utilizado para el evento tuviera un tipo de devolución no nulo o un parámetro 'out'? –
@JonSkeet Buen punto, realmente no lo consideré; los parámetros de salida y los valores de retorno no son realmente útiles para los eventos. Pero esperaría un error de conversión, una excepción, etc. Básicamente, me gustaría suponer que esos tipos no se usarían como controladores de eventos para mi propia cordura. – Siege