2009-07-19 11 views
8

まず、VS2005とC#2.0を使用しています。C#2.0 generics:パラメータがゼロのActionオブジェクトを作成する方法

私は、SelectedIndexChangedイベントの内部からコンボボックスのTextプロパティを設定しようとしています。 StackOverflowの上ここでは別のthreadから、これは次のように行われ、提案された:このすべての最初の、今

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

を私のためのコンパイラエラーを返します。これは、Actionオブジェクトが2つの言語仕様で異なる動作をするためです。 C#2.0では、Actionオブジェクトはすべての宣言で<T>構造体を必要とするようです。たぶん私は間違っていますが、私はそれを明確にしたいと思います。しかし、ちょうど私がするつもりはないよ、特に以来(typeパラメータを使用して、Actionオブジェクトを定義しに私が持っているように私には非常に奇妙なようだ

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

:どのような作業には、次のされない

パラメータを渡してください)!何らかの形でこのパラメータを削除すると、空の新しいオブジェクト[]も廃止されます。

上記の呼び出しを簡略化できる人はいますか?

最後に、BeginInvokeがSelectedIndexChangedの後に終了し、コンボボックスのTextプロパティを正しいテキストで更新することが保証されますか?

これらの質問に対する回答を本当にありがとうと思います。

+0

コンパイルエラーは、ラムダ式のためです。 LambdaはC#3.0で新しく、デリゲート作成構文の短い形式です。 –

答えて

9

パラメータがないアクションは.NET 2.0で利用可能とは思わない 心配する必要はありません。定義済みの異なるデリゲートタイプを使用してください。 MethodInvokerはジョブを実行する必要があります(パラメータを指定しないvoidメソッド)。

また、BeginInvokeには2つのオーバーロードがあります.1つはデリゲートを受け取り、もう1つはデリゲートとオブジェクトの配列を取ります。

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

'System.Action'が来る前に' MethodInvoker'を何度も使ってきました。 :) –

9

独自のアクションデリゲートを定義できます。

delegate void Action()

私はあなたがBeginInvokeメソッドを呼び出しているれているオブジェクトを参照することはできませんが、それはコンボボックスと同じスレッド上で作成されたUIコントロールがある場合は、あなたが渡すデリゲートは、いくつかを呼び出すことが保証されていますSelectedIndexChangedイベントハンドラが完了した後の時刻です。

関連する問題