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
- public static bool IsEventAlreadyRegistered<T>(T source, object target, string eventName) where T : class
- {
- if (source == null)
- throw new ArgumentNullException("source");
- if (target == null)
- throw new ArgumentNullException("target");
-
- return (typeof (T)
- .GetEvents()
- .Where(@event => @event.Name == eventName)
- .Select(@event => source.GetType().GetField(@event.Name, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance))
- .Select(fi => fi.GetValue(source)))
- .OfType<MulticastDelegate>()
- .Any(@delegate => @delegate.GetInvocationList()
- .Any(_delegate => _delegate.Target == target));
- }
Esempio
Code Snippet
- [Test]
- public void WhenEventIsMappedIsEventAlreadyRegisteredReturnTrue()
- {
- var source = new EventSourceStub();
- source.SomeEvent += ReflectionExtensionsEventTest_MyEvent;
- Assert.IsTrue(ReflectionExtensions.IsEventAlreadyRegistered(source, this, "SomeEvent"));
- }
-
- void ReflectionExtensionsEventTest_MyEvent(object sender, EventArgs e)
- {
- }
Vedi progetto FxCommon sorgente ReflectionExtensions.cs test ReflectionExtensionsTest