我最近创建了这两个(不相关的)方法来替换我的 winforms 应用程序中的大量样板代码。据我所知,它们工作正常,但我需要一些保证/建议,看看是否存在我可能遗漏的问题。
(凭内存)
static class SafeInvoker
{
//Utility to avoid boiler-plate InvokeRequired code
//Usage: SafeInvoker.Invoke(myCtrl, () => myCtrl.Enabled = false);
public static void Invoke(Control ctrl, Action cmd)
{
if (ctrl.InvokeRequired)
ctrl.BeginInvoke(new MethodInvoker(cmd));
else
cmd();
}
//Replaces OnMyEventRaised boiler-plate code
//Usage: SafeInvoker.RaiseEvent(this, MyEventRaised)
public static void RaiseEvent(object sender, EventHandler evnt)
{
var handler = evnt;
if (handler != null)
handler(sender, EventArgs.Empty);
}
}
编辑:参见相关问题 here
更新
继死锁问题(与 this question 相关)之后,我已从 Invoke 切换到 BeginInvoke(参见解释 here)。
另一个更新
关于第二个片段,我越来越倾向于使用“空委托(delegate)”模式,它通过直接用空处理程序声明事件来“从源头”解决这个问题,如下所示:
event EventHandler MyEventRaised = delegate {};
最佳答案
这是个好东西。尽管使它们成为扩展方法以进一步清理您的代码。例如:
//Replaces OnMyEventRaised boiler-plate code
//Usage: SafeInvoker.RaiseEvent(this, MyEventRaised)
public static void Raise(this EventHandler eventToRaise, object sender)
{
EventHandler eventHandler = eventToRaise;
if (eventHandler != null)
eventHandler(sender, EventArgs.Empty);
}
现在在你的事件中你可以调用:myEvent.Raise(this);
关于c# - 样板代码替换——这段代码有什么不好的地方吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/192980/