Pergunta

Eu tenho uma classe com um evento:

public event MyEventHandler MyEvent;

Existe alguma maneira de obter um identificador para a coleção de objetos (por reflexão ou não) que estão escutando para este evento?

Editar - Hum, desculpe para mover os postes - I necessidade para ser capaz de fazer isso usando a reflexão bc eu tenho um valor cadeia que representa o nome do evento, e eu precisa encontrar os ouvintes. Eu não posso ver uma maneira óbvia de acessar a propriedade GetInvocationList usando a reflexão ...

Obrigado!

Foi útil?

Solução

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

Fazer isso através de reflexão será um tanto ofuscado, se ainda possível, infelizmente, porque esta sintaxe:

public event EventHandler MyEvent;

...

MyEvent(this, EventArgs.Empty);

é açúcar sintático. O que isto realmente faz é:

private EventHandler compilerGeneratedName;

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

...

compilerGeneratedName(this, EventArgs.Empty);

Em outras palavras, eventos sempre tiveram a abreviação declarativa que as propriedades só recentemente recebeu. Como resultado, a fim de obter a lista de invocação você terá que inspecionar a variável privada, que é nomeado pelo compilador (a não ser, é claro, você usa a sintaxe longhand si mesmo e sei o nome da variável de instância).

Não há nenhuma maneira direta para associar uma construção event exposta externamente com um manipulador de apoio mais do que há um caminho direto para amarrar um property a uma variável de apoio: a saber, porque não há necessariamente um one-to relacionamento -um . Muito provavelmente não é, mas como uma regra que não tem que ser assim.

Você pode tentar usar o reflexo para inspecionar as variáveis ??particulares que são do tipo EventHandler<> adequada sobre o tipo que declara o evento (note que você terá que fazê-lo no tipo específico , que declara o evento, não em uma subclasse) e veja se você pode determinar algum tipo de correlação com os nomes, mas isso vai ser uma solução confiável na melhor das hipóteses.

Outras dicas

MulticastDelegate.GetInvocationList()
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top