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);
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
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
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