Использование Delegate.GetInvocationList
.
if (SecondChange != null)
{
DateTime now = DateTime.Now;
foreach (Delegate d in SecondChange.GetInvocationList())
{
Console.WriteLine(d.DynamicInvoke(now));
}
}
это хорошая практика, чтобы просто использовать Action / Func вместо того, чтобы вручную объявлять делегата?
Да. Но я укажу, что для событий лучше всего использовать EventHandler<T>
вместо Func<..., TResult>
. EventHandler<T>
не поддерживает возвращаемые значения, но вы несколько оправдываетесь тем, что есть несколько событий .NET, которые имеют возвращаемые значения. Я бы посоветовал иметь настраиваемое свойство в пользовательском подклассе EventArgs
, который вы используете в качестве T
. Это образец, который мы видим в таких вещах, как KeyEventArgs.Handled
. Таким образом, вы можете использовать EventHandler<T>
, и подписчики также могут ограничивать свои ответы в ограниченной степени, получая и устанавливая это свойство.