4

我目前正在将一个EventHandler对象传递给一个 util 函数,如下所示:

Timer newTimer(int interval, System.Timers.ElapsedEventHandler handler) {
    ....
    timer.Elapsed += handler;
    ....
}

newTimer(1000, new System.Timers.ElapsedEventHandler(myTimer_Tick));

但这很丑陋,并迫使每个调用者创建一个EventHandler对象。我如何将其更改为这样的东西?

Timer newTimer(int interval, ref Function handler) {
    ....
    timer.Elapsed += new System.Timers.ElapsedEventHandler(handler);
    ....
}

newTimer(1000, ref myTimer_Tick);
4

1 回答 1

6

不清楚你为什么在ref这里使用,但如果myTimer_Tick有正确的签名,你根本不需要改变你的方法 - 你可以使用:

newTimer(1000, myTimer_Tick);

这使用方法组转换而不是显式委托创建语句。虽然它做同样的事情。

如果您希望能够使用无参数的 void 方法,您可以编写一个辅助方法来获取 an并通过 lambda 表达式将其Action包装在 an 中:ElapsedEventHandler

Timer StartTimer(int interval, Action action)
{
    ...
    timer.Elapsed = (sender, args) => action();
    ...
}
于 2012-09-02T07:52:29.060 回答