I’m trying to create a generic method which assigns (and deassigns) an event handler to an object instance’s event at runtime.
Something like:
private void MyMethod<TEventArgs>(...)
where TEventArgs : EventArgs
{
EventHandler<TEventArgs> eventHandler = (s, e) =>
{
// logic
}
// want to assign eventHandler to an object instance passed into this method
// more logic
// want to deassign eventHandler from object instance
}
Currently, I’m passing in an assignEvent and deassignEvent delegate, something like:
private void MyMethod<TEventArgs>(Action<EventHandler<TEventArgs>> assignEvent, Action<EventHandler<TEventArgs>> deassignEvent)
{
EventHandler<TEventArgs> eventHandler = (s, e) =>
{
// logic
}
assignEvent(eventHandler);
// more logic
deassignEvent(eventHandler);
}
And then calling the method like so:
var myObject = new MyObject();
MyMethod<MyEventArgs>(e => myObject.MyEvent += e, e => myObject.MyEvent -= e);
This just seems really horrible though!
What other options do I have?
A potentially better option here is to convert this to an
IObservable<T>, via using Observable.FromEvent (in the Rx Framework). This allows you to treat the event itself in a first class manner, pass it into your method, thenDispose()the subscription at the end.