在运行时以通用方式将事件处理程序分配给对象实例

时间:2011-03-04 17:35:09

标签: .net events event-handling generics

我正在尝试创建一个泛型方法,该方法在运行时将事件处理程序分配(并取消分配)给对象实例的事件。

类似的东西:

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);

这看起来真的太可怕了!

我还有其他选择吗?

2 个答案:

答案 0 :(得分:2)

此处可能更好的选择是使用Observable.FromEvent(在Rx框架中)将其转换为IObservable<T>。这允许您以第一类方式处理事件本身,将其传递给您的方法,然后在最后Dispose()订阅。

答案 1 :(得分:1)

不幸的是,没有更清洁的选择。尽管事件在宣告类中作为普通代表成员使用,但不作为代表公开公开。 event关键字表示它公开了addremove功能,但没有其他功能。换句话说,你不能只将myObject.MyEvent传递给MyMethod(除非你公开实际的委托,这是一个坏主意)。