我想将一些参数传递给c#中的事件timer_tick,但我不想让它们成为全局变量。这可能吗?
我看了一眼,想出了类似的东西:
//Where I start the timer
lift1Up.Enabled = true;
lift1Up.Tick += (sender, args) => lift1Up_Tick(sender, args, destination, currentFloor);
lift1Up.Start();
private void lift1Up_Tick(object sender, EventArgs e, int dest, int current)
{
//my code
}
非常感谢! 路加。
答案 0 :(得分:1)
是的,但不是那样的。您可以通过继承EventArgs
来定义类class MyEventArgs : EventArgs
{
public int dest { get; set; }
public int current { get; set; }
}
然后你需要手动触发Tick
事件并传递如下参数:
lift1Up_Tick(this, new MyEventArgs { dest = 23, current = 100 });
在tick事件中你可以得到这个论点:
private void lift1Up_Tick(object sender, EventArgs e)
{
var args = (MyEventArgs)e;
int dest = args.dest;
}
我不知道有没有更好的方法。要做到这一点(manuel触发器)你可以添加另一个timer.Set它的间隔然后在它的Tick事件中写下这段代码:
lift1Up_Tick(this, new MyEventArgs { dest = 23, current = 100 });
答案 1 :(得分:1)
你可以只使用lambda作为你的事件处理程序,并从那里访问你的本地变量,C#编译器就会有所作为:
void StartTimer()
{
EventHandler tickHandler = null;
var destination = 5, currentFloor = 0;
tickHandler = (sender, args) =>
{
if (currentFloor == destination)
{
lift1Up.Enabled = false;
lift1Up.Tick -= tickHandler;
MessageBox.Show("Arrived!");
}
else
currentFloor++;
}
// start the timer
lift1Up.Tick += tickHandler;
lift1Up.Enabled = true;
}
答案 2 :(得分:0)
是的,您可以使用 Lambda函数,如上述示例所示。 Lambda函数是嵌套函数的一种形式,因为它们允许访问包含函数范围内的变量。 Lambda表达式定义为:
(input parameters) => expression;
(input parameters) => {statement block};
因此,您可以执行任何表达式或语句块(如调用方法),并且可以查看范围的所有变量(包括事件变量),而无需使其成为全局变量。