2009-07-19 44 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事件處理程序完成後的時間。

相關問題