Как передать событие между классами?
Я знаю, что это звучит смешно (и это так), но последнее время я был в тупике. Поиск не нашел похожего вопроса, поэтому решил его задать.
Вот задействованные объекты:
WinForm -> Speaker -> Tweeter
-> Woofer
[Speaker, Tweeter, Woofer] объявляют событие «SpeakToMe», которое отправляет простое строковое сообщение. События объявляются по стандартному шаблону:
public delegate void SpeakToMeHandler(object sender, SpeakToMeEventArgs e);
public event SpeakToMeHandler SpeakToMe;
protected virtual void OnSpeakToMe(string message)
{
if (SpeakToMe != null) SpeakToMe(this, new SpeakToMeEventArgs(DateTime.Now.ToString() + " - " + message));
}
SpeakToMeEventArgs — это простой класс, наследуемый от EventArgs и содержащий строковое свойство (Message).
Само по себе каждое из этих событий работает нормально. Например, я устанавливаю кнопку в форме для создания, подписки и запуска события для [Динамик, Твитер, НЧ-динамик]. Каждый отчитывается должным образом.
Проблема в том, что Speaker создает [Tweeter, Woofer] и подписывается на их события.
Я хочу, чтобы [Tweeter, Woofer] запускал свое событие, а Speaker потреблял его и запускал собственное событие. Я думал, что это должно быть очень прямолинейно:
void tweeter_SpeakToMe(object sender, SpeakToMeEventArgs e)
{
Console.Out.WriteLine("the tweeter is speaking: " + e.Message);
this.OnSpeakToMe("tweeter rockin' out [" + e.Message + "]");
}
Проходя через эту функцию (в динамике), работает Console.Out.WriteLine. Продолжая выполнять OnSpeakToMe, вы увидите, что делегат имеет значение null.
Событие SpeakToMe спикера подписывается формой. Я понял, что это должно препятствовать тому, чтобы делегат события был нулевым.
Я уверен, что это легко, что я упускаю?
Кстати, если вам интересно, почему я это ищу. [Динамик, твитер, низкочастотный динамик] — это мои демо-заменители для действительно длительной операции обработки данных. Форма запускает несколько из них одновременно и требует обновлений хода выполнения от каждого класса.
Как всегда, любая помощь приветствуется!
Обновление: спасибо всем за отзывы. Я очень ценю помощь! Я подобрал пару хороших советов (@David Basarab & @Brian) и несколько разных идей о том, как структурировать вещи. Опять же, очень признателен!