2009-07-19 79 views
8

首先,我使用VS2005和C#2.0。C#2.0泛型:如何使用零参数创建一个Action对象

我想从SelectedIndexChanged事件中设置一个组合框'Text属性。从另一个thread这里StackOverflow上这个被提议做了以下方法:

BeginInvoke(new Action(() => someCombobox.Text = "x")); 

现在,首先这将返回一个编译器错误我。我相信那是因为Action对象在两种语言规范中表现不同。在C#2.0中,Action对象似乎在所有声明中都需要<T>结构。也许我错了,但我想澄清一下。

什么工作如下:

BeginInvoke(new Action<string>(delegate { someCombobox.Text = "x"; }), new object[] { "" }); 

然而,它只是似乎很奇怪,我认为我与一类参数(尤其是因为我不打算定义操作对象传递任何参数)!以某种方式删除此参数也会使空的新对象[]过时,这正是我想要的。

任何人都可以帮助我简化上述呼叫吗?

最后,确保BeginInvoke将在SelectedIndexChanged之后完成,从而使用正确的文本更新组合框的Text属性?

我真的很感谢这些问题的答案。

+0

编译错误是由于lambda表达式。 Lambda是C#3.0中的新成员,并且是代表创建语法的简短形式。 – 2009-07-19 04:55:32

回答

9

我不认为没有参数的操作在.NET 2.0中可用 不用担心 - 只需使用不同的预定义委托类型即可。 MethodInvoker应该完成这个工作(void方法不带参数)。

此外,BeginInvoke有2个重载 - 一个需要委托,另一个需要委托和对象数组。

BeginInvoke(new MethodInvoker(delegate() 
{ 
    someCombobox.Text = "x"; 
})); 
+0

在`System.Action`出现之前,我已经多次使用`MethodInvoker`。 :) – 2009-07-19 04:48:12

9

你可以定义你自己的Action委托。

delegate void Action()

我不能看到哪个你调用BeginInvoke的对象,但如果是同一个线程组合框上创建一个UI控件,您通过委托可以保证被调用的一些SelectedIndexChanged事件处理程序完成后的时间。