2010-05-09 16 views
6

In altri miei metodi avrei potuto fare qualcosa di simile,C# Delegato proprietà?

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

Ma come faccio a richiamare una proprietà per una situazione come questa?

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

risposta

7

Edit: Il seguente paragrafo non è più applicabile, in quanto la domanda del PO da allora è stato modificato.

Prima di tutto, il secondo codice sembra logicamente corretta: È apparentemente desidera chiamare il setter, ma mentre si fornisce un valore per index, voi non forniscono l'attuale value (vale a dire item). Tornerò su questo argomento in un secondo.


Si potrebbe avvolgere un delegato anonima o funzione lambda intorno alla proprietà setter, per esempio (Utilizzando un delegato anonimo) per renderlo richiamabile:

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

o (utilizzando una funzione lambda a disposizione dal linguaggio C# versione 3):

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

Nota: Si crea un delegato anonima o lambda funzione che accetta un argomento (item). L'altro argomento richiesto (index) viene preso dal contesto "esterno". (Mi viene in mente il termine ). Vedo questo come l'unico modo per non dover modificare il tuo dispatcher in un tipo delegato che a volte viene invocato con due argomenti anziché uno.

Se questo però non è un problema, il codice Invoke potrebbe cambiare per es .:

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

Ops, dimenticato di passare 'value' indietro. Ci proverò domani. Ho pensato * Potrei fare qualcosa di simile, ma non riuscivo a ricordare la sintassi corretta. – mpen

+0

Perché si passa l'articolo ma non l'indice al delegato? Se non è necessario passare l'indice, non dovrebbe essere necessario passare l'articolo? 'dispatcher.Invoke (new Action (() => {this [indice] = value;}));' – mpen

+0

Dall'osservazione del codice che hai postato nella tua domanda, ho assunto che 'dispatcher.Invoke' richiedesse un' Azione '(cioè un delegato con un solo parametro). Tuttavia, se è possibile passare due argomenti, ovviamente si potrebbe anche passare 'index' direttamente al delegato. Scegli ciò che funziona meglio nel tuo caso! – stakx