一尘不染

调用调用中的匿名方法

c#

在想要在Control.Invoke中匿名调用委托的语法上有麻烦。

我们尝试了许多不同的方法,但都无济于事。

例如:

myControl.Invoke(delegate() { MyMethod(this, new MyEventArgs(someParameter)); });

其中someParameter在此方法本地

以上将导致编译器错误:

无法将匿名方法转换为类型“ System.Delegate”,因为它不是委托类型


阅读 231

收藏
2020-05-19

共1个答案

一尘不染

因为Invoke/
BeginInvoke接受Delegate(而不是类型的委托),所以您需要告诉编译器要创建什么类型的委托;MethodInvoker(2.0)或Action(3.5)是常见选择(请注意,它们具有相同的签名);像这样:

control.Invoke((MethodInvoker) delegate {this.Text = "Hi";});

如果需要传递参数,则可以使用“捕获的变量”:

string message = "Hi";
control.Invoke((MethodInvoker) delegate {this.Text = message;});

(注意:如果使用captures async ,则需要谨慎一点,但是 sync 很好-即上述情况很好)

另一种选择是编写扩展方法:

public static void Invoke(this Control control, Action action)
{
    control.Invoke((Delegate)action);
}

然后:

this.Invoke(delegate { this.Text = "hi"; });
// or since we are using C# 3.0
this.Invoke(() => { this.Text = "hi"; });

当然,您可以使用BeginInvoke

public static void BeginInvoke(this Control control, Action action)
{
    control.BeginInvoke((Delegate)action);
}

如果不能使用C#3.0,则可以使用常规实例方法(大概是在Form基类中)执行相同的操作。

2020-05-19