Over a million developers have joined DZone.
{{announcement.body}}
{{announcement.title}}

How to determine event subscriptions at runtime

DZone's Guide to

How to determine event subscriptions at runtime

· ·
Free Resource

I’ve been wanting to know this for years, and finally discovered it the other day when looking inside the Microsoft Composite Application Blocks class in Microsoft.Practices.CompositeUI.BuilderStrategies.CommandStrategy.

There’s some code in this class to discover if an event handler has already been attached to the event, and it goes a little something like this…

private void RegisterCommandHandlers(IBuilderContext context, WorkItem workItem, object target,
string targetID, MethodInfo methodInfo)
{
foreach (CommandHandlerAttribute attr in methodInfo.GetCustomAttributes(typeof(CommandHandlerAttribute), true))
{
Command cmd = workItem.Commands[attr.CommandName];

if (!cmd.IsHandlerRegistered(target, methodInfo))
{
cmd.ExecuteAction += CreateCommandHandler(target, methodInfo);
TraceBuildUp(context, target.GetType(), targetID, Properties.Resources.CommandInjectionBuildUp,
methodInfo.Name, attr.CommandName);
}
}
}

The clever part is the IsHandlerRegistered method above, which uses the System.MulticastDelegate.GetInvocationList() method to discover all the targets of the event…

internal bool IsHandlerRegistered(object target, MethodInfo methodInfo)
{
if (ExecuteAction != null)
{
foreach (Delegate dlg in ExecuteAction.GetInvocationList())
{
if (dlg.Target == target && dlg.Method == methodInfo)
{
return true;
}
}
}
return false;
}
Topics:

Published at DZone with permission of

Opinions expressed by DZone contributors are their own.

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}