Я помещаю «событие» в кавычки, потому что я понимаю, что это немного синтаксического сахара, а не истинного типа.
У меня есть некоторые события, которые просто связаны с соответствующими событиями в другом классе.Поэтому, когда событие вызывается, отрывок выглядит как
Raiser -> Proxy -> Subscriber
Так что в классе Proxy у меня есть общий шаблон, подобный этому:
Raiser.SomeEvent +=
(_, args) =>
{
if (this.SomeEvent != null)
this.SomeEvent(this, args);
};
Чтобы привести в порядок мой код, я хотел переместить это в другой метод, который возвращает новый делегат, который оборачивает указанный выше код вызова события:
public static EventHandler GetHandlerDelegate(EventHandler handler, Object sender)
{
return
(_, args) =>
{
if (handler != null)
handler(sender, args);
};
}
А затем в Proxy я могу просто сделать:
Raiser.SomeEvent += GetHandlerDelegate(this.SomeEvent, this);
Что гораздо аккуратнее.
Что ж, это нормально, если подписчик не решает подписаться на Proxy.SomeEvent после вышеуказанного вызова.К сожалению, я не передаю «событие» по ссылке, как я надеялся;Теперь я понимаю, что я просто передаю список вызовов, поэтому, когда происходит OtherClass.SomeEvent
и этот анонимный метод вызывается и вызывает «событие» (делегат), которое ему было дано, только те делегаты, которые были добавлены к этому событию в то время, когда я вызывал GetHandlerDelegate (), будет вызываться .Хотя этого на самом деле достаточно для моей текущей ситуации, на самом деле это неприемлемо для такого кодирования.
Я прочитал некоторые другие вопросы SO и понял, что есть что-то под названием Reactive Extensions, которое может помочь, но на этомраз я ищу более простое решение, если оно есть.(Если нет, я просто не буду этого делать.)
Есть ли другой способ выполнить то, что я пытаюсь сделать, без указанного недостатка?
Если этот вопроснеясно, см. мой ответ , который, надеюсь, поможет прояснить его.