когда событие имеет несколько подписчиков, как я получаю возвращаемое значение для каждого подписчика?

Да я нашел, что, чтобы быть эффективным, это будет длинное, хотя, и конечно необходимо индексировать помещенного в черный список дюйм/с в целочисленной форме.

16
задан John Saunders 24 July 2014 в 11:05
поделиться

2 ответа

Используйте Delegate.GetInvocationList .

if (SecondChange != null)
{
    DateTime now = DateTime.Now;
    foreach (Delegate d in SecondChange.GetInvocationList())
    {
        Console.WriteLine(d.DynamicInvoke(now));
    }
}

это хорошая практика - просто использовать Action / Func вместо ручного объявления делегата?

Да. Но я отмечу, что лучше всего для событий использовать EventHandler вместо Func <..., TResult> . EventHandler не поддерживает возвращаемые значения, но вы в некоторой степени оправданы тем, что есть несколько событий .NET, которые имеют возвращаемые значения. Я бы посчитал, что лучше иметь настраиваемое свойство в пользовательском подклассе EventArgs , который вы используете в качестве своего T . Это шаблон, который мы видим в таких вещах, как KeyEventArgs.Handled . Таким образом, вы можете использовать EventHandler

28
ответ дан 30 November 2019 в 21:03
поделиться

Я думаю, что использовать Action - это прекрасно. / Func вместо делегата.

НО нельзя использовать события таким образом. Они срабатывают в неопределенный момент времени, поэтому вы просто не знаете всех параметров.

Вероятно, вам действительно понадобится:

  1. Использовать полиморфизм для часов.
  2. Используйте шаблоны посетитель / подписчик / наблюдатель, чтобы получить их значения.

Таким образом, код будет выглядеть так:

var theClock = new Clock();
theClock.AddSecondsSubscriber(new DisplayClock());
theClock.AddSecondsSubscriber(new LogClock());
theClock.RunAndExecuteVisitors( theBoolResultYouNeed => Console.WriteLine(theBoolResultYouNeed) );
1
ответ дан 30 November 2019 в 21:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: