Edit: Poniższy akapit nie stosuje się, jako kwestia PO za ten został edytowany.
Po pierwsze, drugi kod wydaje
logicznie niepoprawne: Ty najwyraźniej chcą wywołać setter, ale jednocześnie podać wartość dla
index
, nie zapewniają rzeczywisty
value
(tj
item
). Powrócę do tej kwestii w ciągu sekundy.
Można owinąć anonimowego delegata lub funkcji lambda wokół nieruchomości ustawiająca, np (Przy użyciu anonimowych delegata), aby uczynić go invokable:
dispatcher.Invoke(
new Action<T>( delegate (T item) { this[index] = item; } ),
item);
lub (używając funkcji lambda dostępny od języka C# w wersji 3):
dispatcher.Invoke(
new Action<T>( (T item) => { this[index] = item; } ),
item);
Uwaga: utworzyć anonimowy delegata lub lambda funkcja, która akceptuje jeden argument (item
). Drugi wymagany argument (index
) pochodzi z kontekstu "zewnętrznego". (Termin zamknięcie przychodzi na myśl.) Widzę to jako jedyny sposób, w jaki nie musiałbyś zmieniać swojego dispatcher
na typ delegata, który jest czasami wywoływany z dwoma argumentami zamiast jednego.
Jeśli to jednak nie jest problem, kod Invoke
może zmienić się np .:
dispatcher.Invoke(
new Action<int,T>( (int index, T item) => { this[index] = item; } ),
index, item);
ups, zapomniał przekazać 'value' powrotem. Spróbuję tego jutro. Myślałem, że mogę zrobić coś takiego, ale nie pamiętałem właściwej składni. – mpen
Dlaczego przekazujesz przedmiot, ale nie indeks delegatowi? Jeśli nie jest konieczne przekazanie indeksu, nie powinno być również konieczne przekazanie tego elementu? 'dispatcher.Invoke (new Action (() => {this [index] = value;}));' – mpen
Patrząc na kod, który opublikowałeś w swoim pytaniu, założyłem, że 'dispatcher.Invoke' wymaga' Action '(tzn. delegat z jednym parametrem). Jeśli jednak możesz przekazać dwa argumenty, możesz oczywiście przekazać 'index' bezpośrednio do delegata. Wybierz, co działa najlepiej w Twoim przypadku! –
stakx