Да я нашел, что, чтобы быть эффективным, это будет длинное, хотя, и конечно необходимо индексировать помещенного в черный список дюйм/с в целочисленной форме.
Используйте 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
Я думаю, что использовать Action - это прекрасно. / Func вместо делегата.
НО нельзя использовать события таким образом. Они срабатывают в неопределенный момент времени, поэтому вы просто не знаете всех параметров.
Вероятно, вам действительно понадобится:
Таким образом, код будет выглядеть так:
var theClock = new Clock();
theClock.AddSecondsSubscriber(new DisplayClock());
theClock.AddSecondsSubscriber(new LogClock());
theClock.RunAndExecuteVisitors( theBoolResultYouNeed => Console.WriteLine(theBoolResultYouNeed) );