2010-05-09 16 views
6

En mis otros métodos que podía hacer algo como esto,C# Delegado de propiedad?

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

pero ¿cómo puedo invocar una propiedad para una situación como esta?

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

Respuesta

7

Editar: El siguiente párrafo ya no se aplica, ya que la pregunta de la OP ya ha sido editado.

En primer lugar, el segundo código parece lógicamente incorrectos: Evidentemente, usted desea llamar la incubadora, pero mientras que proporciona un valor para index, que no proporcionan el actual value (es decir item). Volveré sobre ese tema en un segundo.


Se podría envolver un delegado anónima o función lambda alrededor del colocador propiedad, por ejemplo, (Utilizando un delegado anónimo) para que sea invocable:

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

o (usando una función lambda disponible desde la versión del lenguaje C# 3):

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

Nota: Se crea un delegado anónimo o lambda función que acepta un argumento (item). El otro argumento requerido (index) se toma del contexto "exterior". (El término cierre me viene a la mente.) Veo esto como la única forma en que no tendría que cambiar su dispatcher por un tipo de delegado que a veces se invoca con dos argumentos en lugar de uno.

Si esto sin embargo no es un problema, el código podría cambiar a Invoke ej .:

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

Vaya, se olvidó de pasar 'valor' espalda. Voy a intentar esto mañana. Yo * pensé * Podría hacer algo como esto, pero no podía recordar la sintaxis adecuada. – mpen

+0

¿Por qué le pasa el artículo pero no el índice al delegado? Si no es necesario pasar el índice, ¿entonces tampoco debería ser necesario pasar el ítem? 'dispatcher.Invoke (new Action ((=) {this [index] = value;}));' – mpen

+0

Al mirar el código que publicó en su pregunta, asumí que 'dispatcher.Invoke' requería' Action '(es decir, un delegado con solo un parámetro). Sin embargo, si puede pasar dos argumentos, entonces también podría pasar 'index' directamente al delegado. ¡Elija lo que funciona mejor en su caso! – stakx