2010-05-09 111 views
6

在我其他的方法,我可以做這樣的事情,C#屬性委託?

public void Add(T item) 
    { 
     if (dispatcher.CheckAccess()) 
     { 
      ... 
     } 
     else 
     { 
      dispatcher.Invoke(new Action<T>(Add), item); 
     } 
    } 

但我怎麼援引這樣的情況的屬性?

public T this[int index] 
    { 
     get 
     { 
      ... 
     } 
     set 
     { 
      if (dispatcher.CheckAccess()) 
      { 
       ... 
      } 
      else 
      { 
       dispatcher.Invoke(???, value, index); // <-- problem is here 
      } 
     } 
    } 

回答

7

編輯:以下段落不再適用,因爲OP的問題已經被編輯過。

首先,你的第二個代碼似乎 邏輯上不正確:你顯然要撥打的二傳手,但是當你的 index提供一個值,你不提供實際 value(即 item)。我會在一秒鐘之內回到這個問題。


你可以環繞屬性setter,例如匿名委託或lambda函數(使用匿名委託),使其可調用:

dispatcher.Invoke(
    new Action<T>( delegate (T item) { this[index] = item; } ), 
    item); 

或(使用,因爲C#語言的版本3提供lambda函數):

dispatcher.Invoke(
    new Action<T>( (T item) => { this[index] = item; } ), 
    item); 

注:您創建一個匿名委託或lambda函數接受一個參數(item)。其他必需的參數(index)取自「外部」上下文。 (想到關閉)我認爲這是唯一的方法,您不必將dispatcher更改爲有時使用兩個參數而不是一個參數調用的委託類型。

如果這不過是不是一個問題,Invoke代碼可以改變例如爲:

dispatcher.Invoke(
    new Action<int,T>( (int index, T item) => { this[index] = item; } ), 
    index, item); 
+0

哎呀,忘了'傳回value'。我明天會試試這個。我想*我可以做這樣的事情,但我不記得正確的語法。 – mpen 2010-05-09 08:26:52

+0

爲什麼你通過該項目,但沒有索引到代表?如果沒有必要通過索引,那麼它不應該有必要通過該項目? 'dispatcher.Invoke(new Action(()=> {this [index] = value;}));' – mpen 2010-05-09 19:41:55

+0

從查看你發佈在你的問題中的代碼,我認爲'dispatcher.Invoke'需要一個'動作 '(即只有一個參數的委託)。但是,如果您可以傳遞兩個參數,那麼您當然也可以直接將'index'傳遞給委託。選擇最適合您的情況! – stakx 2010-05-09 20:37:56