2012-02-22 11 views
0

私はgetterでInvokeを使用したいと思います。 4.0? .Net 2.0については、Funcと.Net 2.0の置き換えは何ですか?ここでプロパティのgetterで.Net 2.0のためのFuncを呼び出さない

は、.NET 4.0(linkから)

public ApplicationViewModel SelectedApplication 
{ 
    get { 
      if (this.InvokeRequired) 
      { 
       return (ApplicationViewModel)this.Invoke(new Func<ApplicationViewModel>(() => this.SelectedApplication)); 
      } 
      else 
      { 
       return _applicationsCombobox.SelectedItem as ApplicationViewModel; 
      } 
     } 
} 
+0

を独自のデリゲートを作成することができます。 – haiyyu

答えて

2

は、.NET 2.0を使用しているので、あなたはあなたに利用できるFuncデリゲートを持っていませんが、あなたはMethodInvokerデリゲートを使用することができます:ここに は、いくつかのより多くの読書です。

.NET 2.0でラムダ式構文を使用することはできませんが、以下のコード例に示すように、「匿名の代理人」構文(ほとんど同じことです)を使用できます。

UI以外のスレッドからUIコントロールのデータを照会するのは一般的ではありません。通常、UIコントロールはUIスレッドで実行されるイベントをトリガするので、必要なデータをUIコントロールから収集し、そのデータを他の関数に渡すので、Invokeを心配する必要はありません。

public ApplicationViewModel SelectedApplication 
{ 
    get 
    { 
     if (this.InvokeRequired) 
     { 
      ApplicationViewModel value = null; // compiler requires that we initialize this variable 
      // the call to Invoke will block until the anonymous delegate has finished executing. 
      this.Invoke((MethodInvoker)delegate 
      { 
       // anonymous delegate executing on UI thread due calling the Invoke method 
       // assign the result to the value variable so that we can return it. 
       value = _applicationsCombobox.SelectedItem as ApplicationViewModel; 
      }); 
      return value; 
     } 
     else 
     { 
      return _applicationsCombobox.SelectedItem as ApplicationViewModel; 
     } 
    } 
} 

EDIT:あなたのケースでは

は、しかし、あなたはこのような何かを行うことができるはず今、私はあなたの.NET 4.0のコードサンプルを見ても、起動機能を見ていることを、私は見それがどのように価値を返すことができるか(私が前に使用する理由はなかった)。

まあ、MethodInvokerデリゲートは戻り値を期待していませんが、@ haiyyuが指摘したように、独自のデリゲートを定義することができます。たとえば、あなたは自分自身のFunc<TResult>デリゲートを定義する必要があるだろう、と元のコードは、おそらく正常に動作します:MSDNのページから

// this is all that is required to declare your own Func<TResult> delegate. 
delegate TResult Func<TResult>(); 

サンプルコード:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     // Create a timer that will call the ShowTime method every second. 
     var timer = new System.Threading.Timer(ShowTime, null, 0, 1000);   
    } 

    private void ShowTime(object x) 
    { 
     // Don't do anything if the form's handle hasn't been created 
     // or the form has been disposed. 
     if (!this.IsHandleCreated && !this.IsDisposed) return; 

     // Invoke an anonymous method on the thread of the form. 
     this.Invoke((MethodInvoker) delegate 
     { 
      // Show the current time in the form's title bar. 
      this.Text = DateTime.Now.ToLongTimeString(); 
     }); 
    } 
} 
+0

偉大な答え、ありがとう! – jotbek

関連する問題