Skip to content

Instantly share code, notes, and snippets.

@Kikimora
Created July 5, 2016 22:43
Show Gist options
  • Save Kikimora/177098f91d618bf75fd3c5820d88204e to your computer and use it in GitHub Desktop.
Save Kikimora/177098f91d618bf75fd3c5820d88204e to your computer and use it in GitHub Desktop.
public class EventHandlerSource : IEventSource
{
readonly RuntimeEvent @event;
readonly object owner;
readonly Delegate eventHandler;
static readonly MethodInfo HandleOwnerEventMethodInfo = typeof(EventHandlerSource)
.GetMethod("HandleOwnerEvent", BindingFlags.NonPublic | BidningFlags.Instance);
event EventHandler handler;
int subscriptions = 0;
public EventHandlerSource (RuntimeEvent @event, object owner)
{
this.@event = @event;
this.owner = owner;
eventHandler = @event.CreateDelegate(this, HandleOwnerEventMethodInfo);
}
void HandleOwnerEvent(object sender, EventArgs args) {
if (Handler != null) {
Handler(sender, args);
}
}
public void SetEnabled (bool enabled)
{
if (SetEnabledAction != null)
SetEnabledAction (Owner, enabled);
}
public object Owner { get { return owner; } }
public Action<object, bool> SetEnabledAction { get; set; }
public event EventHandler Handler {
add {
handler += value;
if (subscriptions == 0)
this.@event.AddEventHandler(Owner, eventHandler);
subscriptions++;
}
remove {
handler -= value;
subscriptions--;
if (subscriptions == 0)
this.@event.RemoveEventHandler(Owner, eventHandler);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment