Ped*_*ery 8 c# generics action .net-2.0 winforms
首先,我使用的是VS2005和C#2.0.
我正在尝试从SelectedIndexChanged事件中设置一个组合框'Text属性.从StackOverflow上的另一个线程来看,这是通过以下方式完成的:
BeginInvoke(new Action(() => someCombobox.Text = "x" ));
Run Code Online (Sandbox Code Playgroud)
现在,首先这将为我返回编译器错误.我相信这是因为Action对象在两种语言规范中的行为不同.在C#2.0中,Action对象似乎需要<T>所有声明中的结构.也许我错了,但我想澄清一下.
工作如下:
BeginInvoke(new Action<string>( delegate { someCombobox.Text = "x"; }), new object[] { "" });
Run Code Online (Sandbox Code Playgroud)
但是,我似乎非常奇怪,我必须使用类型参数定义Action对象(特别是因为我不打算传递任何参数)!以某种方式删除此参数也会使空的新对象[]过时,这就是我想要的.
任何人都可以帮我简化上述电话吗?
最后,是否保证BeginInvoke将在SelectedIndexChanged之后完成,从而使用正确的文本更新组合框'Text属性?
我真的很感激能够学习这些问题的答案.
Fil*_*ącz 10
我不认为.NET 2.0中没有参数的Action没有后顾之忧 - 只需使用不同的预定义委托类型.MethodInvoker应该完成这项工作(没有参数的void方法).
此外,BeginInvoke有2个重载 - 一个接受委托,另一个接受委托和对象数组.
BeginInvoke(new MethodInvoker(delegate()
{
someCombobox.Text = "x";
}));
Run Code Online (Sandbox Code Playgroud)
Sen*_*mar 10
您可以定义自己的Action委托.
delegate void Action()
我无法看到您正在调用BeginInvoke的对象,但如果它是在与组合框相同的线程上创建的UI控件,则保证在SelectedIndexChanged事件处理程序完成后的某个时间调用您传递的委托.