Как передать событие между классами?
Я знаю, что это звучит смешно (и это так), но я был озадачен этим в последнее время. Поиск не нашел похожего вопроса, поэтому я решил, что задам его.
Здесь задействованы следующие объекты:
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]. Каждый отчитывается должным образом.
Проблема заключается в том, что Speaker создает [Tweeter, Woofer] и подписывается на их события.
Я хочу, чтобы [Твиттер, Низкочастотный громкоговоритель] запустил свое событие, Спикер поглотил его и запустил свое собственное событие. Я думал, что это должно быть очень просто:
void tweeter_SpeakToMe(object sender, SpeakToMeEventArgs e)
{
Console.Out.WriteLine("the tweeter is speaking: " + e.Message);
this.OnSpeakToMe("tweeter rockin' out [" + e.Message + "]");
}
Пройдя через эту функцию (в Speaker), Console.Out.WriteLine работает. Продолжая шагать по OnSpeakToMe, показывает, что делегат имеет значение null.
SpeakerToMe на событие докладчика подписывается формой. Я понял, что это должно предотвратить нулевой делегат события.
Я уверен, что это легко, что мне не хватает?
Кстати, если вам интересно, почему я ищу это. [Speaker, Tweeter, Woofer] - мои демо-стенды для действительно длительной операции обработки данных. Форма запускает несколько из них одновременно и требует обновления прогресса от каждого класса.
Как всегда, любая помощь очень ценится!
Обновление: Спасибо всем за отзывы. Я очень ценю помощь! Я подобрал пару хороших советов (@David Basarab & @Brian) и несколько разных идей о том, как структурировать вещи. Опять же, высоко ценится!