Pregunta

Tengo una clase con un evento:

public event MyEventHandler MyEvent;

¿Hay alguna forma de manejar la colección de objetos (por reflexión o de otro modo) que escuchan este evento?

EDITAR - Um, lamento mover los postes de meta - necesito para poder hacer esto usando la reflexión bc Tengo un valor de cadena que representa el nombre del evento, y yo Necesito encontrar a los oyentes. No puedo ver una forma obvia de acceder a la propiedad GetInvocationList usando la reflexión ...

¡Gracias!

¿Fue útil?

Solución

List<object> targets = MyEvent.GetInvocationList().Select(d => d.Target).ToList();

Hacer esto a través de la reflexión será algo ofuscado, si es posible, desafortunadamente, porque esta sintaxis:

public event EventHandler MyEvent;

...

MyEvent(this, EventArgs.Empty);

Es azúcar sintáctico. Lo que esto realmente hace es:

private EventHandler compilerGeneratedName;

public event EventHandler MyEvent
{
    add { compilerGeneratedName += value; }
    remove { compilerGeneratedName -= value; }
}

...

compilerGeneratedName(this, EventArgs.Empty);

En otras palabras, los eventos siempre han tenido la taquigrafía declarativa que las propiedades recibieron recientemente. Como resultado, para llegar a la lista de invocación, deberá inspeccionar la variable privada, que es nombrada por el compilador (a menos que, por supuesto, use la sintaxis de mano larga y conozca la nombre de la variable de instancia).

No hay una forma directa de asociar una construcción event expuesta externamente con un controlador de respaldo más que una forma directa de vincular un property a una variable de respaldo: es decir, porque no necesariamente una relación uno a uno . Muy probablemente sí, pero por regla general no tiene por qué ser así.

Puede intentar usar la reflexión para inspeccionar las variables privadas que son del tipo EventHandler<> apropiado en el tipo que declara el evento (tenga en cuenta que tendrá que hacerlo en el tipo específico que declara el evento, no en una subclase) y vea si puede determinar algún tipo de correlación con los nombres, pero esta será una solución poco confiable en el mejor de los casos.

Otros consejos

MulticastDelegate.GetInvocationList()
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top