Можно ли зарегистрировать одно событие в другом без вспомогательного метода в C #? - PullRequest
1 голос
/ 20 июня 2010

У меня два одинаковых события в разных классах:

A.eventA

B.eventB

Эти два события: eventA и eventB определены через один и тот же делегат, поэтому события имеют одинаковое возвращаемое значение и параметры Можно ли уволить A.eventA в тот момент, когда B.eventB уволят?

Я могу написать метод:

void return-value-of-delegate connect(parameters of delegate)
{
   if (A.eventA != null)
   {
      A.eventA(parameters of delegate);
   }
}

Мне просто интересно, смогу ли я сократить свой код.

Спасибо!

(Примечание. Мой код - проект WPF, поэтому тег WPF.)

РЕДАКТИРОВАТЬ: В классе A является ссылкой на класс B.

Ответы [ 4 ]

1 голос
/ 20 июня 2010

Всякий раз, когда EventB срабатывает, EventA также срабатывает:

class A {
  private B b;
  public event EventHandler EventA {
    add {
      b.EventB += value;
    }
    remove {
      b.EventB -= value;
    }
  }
  public A() {
    b = new B();
  }
  // ...
}

Все слушатели событий теперь зарегистрированы в классе B.

1 голос
/ 20 июня 2010

Вы не можете поднять событие за пределами класса. Только сам класс может поднять свои собственные события. С другой стороны, вы можете предоставить открытый метод, принимающий те же параметры, которые внутренне вызывают указанное событие.

Использование Reflection также не является опцией, которая позволяет только подписаться на событие другого класса и удалять его.

0 голосов
/ 20 июня 2010

Тот факт, что события определены в разных классах, означает, что они не одно и то же событие, даже если они могут иметь одинаковую подпись.Вы не можете запускать события из двух отдельных классов одновременно.

Помимо прочего, учтите, что событие обычно вызывается из экземпляра класса.Какой экземпляр B.eventB вы бы сработали, когда произойдет A.eventA?

0 голосов
/ 20 июня 2010

Нет, вы не можете, если только код не находится в классе, который объявляет событие.События могут быть запущены только из декларирующего класса.Возможно, вам придется использовать событие с аргументами обоих классов и в ответ запустить событие, но вы не можете гарантировать, что они будут запущены в одно и то же время, только в одно и то же время, в зависимости от методов, зарегистрированных для каждого событиятак как они будут выполняться в одном потоке.

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