我正在尝试创建一个泛型方法,该方法在运行时将事件处理程序分配(并取消分配)给对象实例的事件。
类似的东西:
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
}
目前,我正在传递assignEvent和deassignEvent委托,例如:
private void MyMethod<TEventArgs>(Action<EventHandler<TEventArgs>> assignEvent, Action<EventHandler<TEventArgs>> deassignEvent)
{
EventHandler<TEventArgs> eventHandler = (s, e) =>
{
// logic
}
assignEvent(eventHandler);
// more logic
deassignEvent(eventHandler);
}
然后调用这样的方法:
var myObject = new MyObject();
MyMethod<MyEventArgs>(e => myObject.MyEvent += e, e => myObject.MyEvent -= e);
这看起来真的太可怕了!
我还有其他选择吗?
答案 0 :(得分:2)
此处可能更好的选择是使用Observable.FromEvent(在Rx框架中)将其转换为IObservable<T>
。这允许您以第一类方式处理事件本身,将其传递给您的方法,然后在最后Dispose()
订阅。
答案 1 :(得分:1)
不幸的是,没有更清洁的选择。尽管事件在宣告类中作为普通代表成员使用,但不作为代表公开公开。 event
关键字表示它公开了add
和remove
功能,但没有其他功能。换句话说,你不能只将myObject.MyEvent
传递给MyMethod
(除非你公开实际的委托,这是一个坏主意)。