And*_*Hin 57 c# events callback
比方说,我想在分配事件处理程序时传递一些额外的数据.请考虑以下代码:
private void setup(string someData)
{
Object.assignHandler(evHandler);
}
public void evHandler(Object sender)
{
// need someData here!!!
}
Run Code Online (Sandbox Code Playgroud)
我如何将someData放入我的evHandler方法?
spe*_*der 54
private void setup(string someData)
{
Object.assignHandler((sender) => evHandler(sender,someData));
}
public void evHandler(Object sender, string someData)
{
// need someData here!!!
}
Run Code Online (Sandbox Code Playgroud)
del*_*ttg 24
我很难搞清楚@ spender上面的例子,尤其是:Object.assignHandler((sender) => evHandler(sender,someData));
因为Object.assignHandler
字面意义上没有这样的东西.所以我做了一点谷歌搜索并找到了这个例子.Peter Duniho的回答是点击了我的脑袋(这不是我的工作):
SNIP
通常的方法是使用具有已修改签名的事件处理程序的匿名方法.例如:
Run Code Online (Sandbox Code Playgroud)void Onbutton_click(object sender, EventArgs e, int i) { ... } button.Click += delegate(object sender, EventArgs e) { Onbutton_click(sender, e, 172); };
当然,您不必传入172,甚至不能将第三个参数设为int.:)
/剪断
使用该示例,我能够使用lambda表示法将两个自定义ComboBoxItem
对象传递给Timer.Elapsed
事件:
simulatorTimer.Elapsed +=
(sender, e) => onTimedEvent(sender, e,
(ComboBoxItem) cbPressureSetting.SelectedItem,
(ComboBoxItem) cbTemperatureSetting.SelectedItem);
Run Code Online (Sandbox Code Playgroud)
然后进入它的处理程序:
static void onTimedEvent(object sender, EventArgs e, ComboBoxItem pressure, ComboBoxItem temperature)
{
Console.WriteLine("Requested pressure: {0} PSIA\nRequested temperature: {1}° C", pressure, temperature);
}
Run Code Online (Sandbox Code Playgroud)
这不是上面示例中的任何新代码,但它确实演示了如何解释它们.希望像我这样的人发现它具有指导性和实用性,所以他们不会像我一样花费数小时来理解这个概念.
这段代码适用于我的项目(除了非线程安全的异常ComboBoxItem
,我不相信的对象会改变示例的工作原理).我现在正在搞清楚.
Mar*_*ell 18
捕获的变量:
private void setup(string someData)
{
Object.assignHandler((sender,args) => {
evHandler(sender, someData);
});
}
public void evHandler(Object sender, string someData)
{
// use someData here
}
Run Code Online (Sandbox Code Playgroud)
或者(C#2.0替代方案):
Object.assignHandler((EventHandler)delegate(object sender,EventArgs args) {
evHandler(sender, someData);
});
Run Code Online (Sandbox Code Playgroud)