Problema

Verificare se un evento "incapsulato" ( public event ... ) è già registrato dato l'oggetto origine che genera ed incapsula l'evento, l'oggetto di destinazione che ha registrato l'evento e il nome dell'evento.

Soluzione

Code Snippet
  1. public static bool IsEventAlreadyRegistered<T>(T source, object target, string eventName) where T : class
  2. {
  3.     if (source == null)
  4.         throw new ArgumentNullException("source");
  5.     if (target == null)
  6.         throw new ArgumentNullException("target");
  7.  
  8.     return (typeof (T)
  9.         .GetEvents()
  10.         .Where(@event => @event.Name == eventName)
  11.         .Select(@event => source.GetType().GetField(@event.Name, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance))
  12.         .Select(fi => fi.GetValue(source)))
  13.         .OfType<MulticastDelegate>()
  14.         .Any(@delegate => @delegate.GetInvocationList()
  15.             .Any(_delegate => _delegate.Target == target));
  16. }

Esempio

Code Snippet
  1. [Test]
  2. public void WhenEventIsMappedIsEventAlreadyRegisteredReturnTrue()
  3. {
  4.     var source = new EventSourceStub();
  5.     source.SomeEvent += ReflectionExtensionsEventTest_MyEvent;
  6.     Assert.IsTrue(ReflectionExtensions.IsEventAlreadyRegistered(source, this, "SomeEvent"));
  7. }
  8.  
  9. void ReflectionExtensionsEventTest_MyEvent(object sender, EventArgs e)
  10. {
  11. }

Vedi progetto FxCommon sorgente ReflectionExtensions.cs test ReflectionExtensionsTest