Из-за того, что Бенджол не знает, почему он помещает Действие в MethodInvoker, и брокер, намеревавшийся использовать его в качестве функции расширения, вот код очистки:
static class SafeInvoker
{
//Utility to avoid boiler-plate InvokeRequired code
//Usage: myCtrl.SafeInvoke(() => myCtrl.Enabled = false);
public static void SafeInvoke(this Control ctrl, Action cmd)
{
if (ctrl.InvokeRequired)
ctrl.BeginInvoke(cmd);
else
cmd();
}
//Replaces OnMyEventRaised boiler-plate code
//Usage: this.RaiseEvent(myEventRaised);
public static void RaiseEvent(this object sender, EventHandler evnt)
{
if (evnt != null)
evnt(sender, EventArgs.Empty);
}
}
Просто последнее замечание: MethodInvoker
и Action
- это просто делегаты, имеющие одинаковую структуру. Из-за этого случая оба заменяются друг на друга. Корень этого именного столкновения происходит от наследия. В начале (.Net 2.0) было только MethodInvoker
и Action(T)
. Но из-за того, что каждый, кто использовал Action(T)
, желает иметь Action
и считает очень неестественным принимать MethodInvoker
. Таким образом, в .Net 3.5 были добавлены Action
, Action(T1, T2, T3, T4)
и все делегаты Func
, но MethodInvoker больше нельзя было удалить без внесения каких-либо критических изменений.
Дополнительно:
Если вы можете использовать .Net 3.5, приведенный выше код подходит, но если вы прикреплены к .Net 2.0, вы можете использовать его как обычную функцию, как и раньше, и заменить Action
на MethodInvoker
.