2010-05-09 22 views
6

W moich innych metod mógłby zrobić coś takiego,C# Delegat nieruchomości?

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

Ale jak mogę powołać się na nieruchomości do takiej sytuacji?

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

Odpowiedz

7

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

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

+0

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

+0

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