Created
July 5, 2016 22:43
-
-
Save Kikimora/177098f91d618bf75fd3c5820d88204e to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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