2010-05-09 18 views

cevap

7

Düzenleme: OP soru düzenleme yapıldı olarak Aşağıdaki paragraf artık geçerlidir. Görünüşe göre ayarlayıcı aramak istediğiniz, ancak index için bir değer sağlarken, gerçek value (yani item) vermeyin:

Öncelikle, ikinci kod mantık hatasına neden görünüyor. Bir saniyede bu konuya döneceğim.


Sen mülkiyet setter, örneğin etrafında bir anonim temsilci veya lambda fonksiyonu sarabilirdiniz (Isimsiz temsilci kullanarak) o Invokable yapmak: Bir anonim temsilci veya lambda oluşturmak:

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

Not:

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

veya (C# dili sürüm 3 beri mevcut bir lambda fonksiyonu kullanılarak) Tek argümanı kabul eden işlev (item). Diğer gerekli argüman (index) "dış" içerikten alınmıştır. (kapanışı ifadesi akla gelir.) Bunu, dispatcher öğenizi bazen bir argüman yerine iki argümanla çağrılan bir temsilci türüne nasıl dönüştürmeniz gerekmeyeceğinin tek yolu olarak görüyorum.

bu ancak bir sorun değilse, Invoke kod, ör .:

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

Oops değiştirebilir geri 'value' geçmek unuttum. Bunu yarın deneyeceğim. Ben böyle düşündüm * Böyle bir şey yapabilirim, ama doğru sözdizimini hatırlayamadım. – mpen

+0

Öğeyi neden aktarıyorsunuz, ancak delege delege aktarmıyor? İndeksi geçmek gerekli değilse, öğeyi geçmek için gerekli olmamalıdır? 'dispatcher.Invoke (new Action (() => {this [index] = değer;}));' – mpen

+0

Sorunuzda yayınladığınız koda bakmadan 'dispatcher.Invoke''nın bir' Action 'gerektirdiğini farz ettim '(yani sadece bir parametreli bir temsilci). Ancak, iki argümandan geçebilirseniz, tabiki de indeksi doğrudan delege de geçirebilirsiniz. Durumunuzda en iyi olanı seçin! – stakx

İlgili konular