2011-06-28 14 views
7

Primero, GetInvocationList() no funcionará, porque quiero poder acceder a ellos desde fuera de la clase. Supongo que va a trabajar con magia de reflexión, y eso es lo que estoy tratando de resolver.¿Cómo puedo obtener una lista de los delegados subyacentes de un evento utilizando la reflexión?

Esto es lo que tengo ahora:

fooEventDispatcher.GetType().GetField("FooEvent", BindingFlags.Instance | BindingFlags.NonPublic); 
var field = fieldInfo.GetValue(fooEventDispatcher); 

yo sólo no saben qué hacer con field. ¿Algunas ideas?

+0

¿Puede indicarnos cuál es el objetivo de consultar la lista de llamadas? Dependiendo del propósito, puede haber una manera más fácil que la reflexión para obtener el resultado que desea. –

+0

@Joel: Quiero probar la unidad de que un objeto se está suscribiendo a un evento. Probar el efecto secundario de la invocación no es una solución limpia. – ryeguy

+0

¿Por qué GetInvocationList() no funciona? Es un método público y cualquiera desde el exterior puede llamar a ese método, a menos que su clase sea interna para el ensamblado. – ferosekhanj

Respuesta

9

Esto debería funcionar:

var fieldInfo = fooEventDispatcher.GetType().GetField(
       "FooEvent", BindingFlags.Instance | BindingFlags.NonPublic); 
var field = fieldInfo.GetValue(fooEventDispatcher); 
MulticastDelegate eventDelegate = (MulticastDelegate)field.GetValue(fooEventDispatcher); 
if (eventDelegate != null) // will be null if no subscribed event consumers 
{ 
    var delegates = eventDelegate.GetInvocationList(); 
} 

También se debe utilizar en lugar de typeof(SomeFooClass)fooEventDispatcher.GetType() si el tipo es ya conocido en tiempo de compilación (que supongo que lo es).

+3

La línea 4 debe ser 'MulticastDelegate eventDelegate = (MulticastDelegate) campo;' – wezten

Cuestiones relacionadas