Назначьте обработчики событий экземпляру объекта во время выполнения универсальным способом - PullRequest
2 голосов
/ 04 марта 2011

Я пытаюсь создать универсальный метод, который назначает (и отменяет назначение) обработчик события событию экземпляра объекта во время выполнения.

Что-то вроде:

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 ]

2 голосов
/ 04 марта 2011

Потенциально лучшим вариантом здесь является преобразование этого значения в IObservable<T>, используя Observable.FromEvent (в Rx Framework). Это позволяет вам обработать само событие первоклассным образом, передать его в ваш метод, а затем Dispose() подписку в конце.

1 голос
/ 04 марта 2011

К сожалению, нет более чистого варианта. Несмотря на то, что события могут быть использованы в объявленном классе как обычный член делегата, они не публикуются как делегаты. Ключевое слово event означает, что оно предоставляет функциональность add и remove, но не более того. Другими словами, вы не можете просто передать myObject.MyEvent в MyMethod (если вы не должны были выставить действительного делегата, что является плохой идеей).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...