2010-05-09 6 views
6

Dans mes autres méthodes que je pouvais faire quelque chose comme ça,C# Délégué de propriété?

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

Mais comment puis-je invoquer une propriété pour une telle situation?

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

Répondre

7

Edit: Le paragraphe suivant ne s'applique plus, comme l'a été modifié depuis la question de l'OP.

Tout d'abord, votre second code semble logiquement incorrect: Vous voulez apparemment appeler le poseur, mais pendant que vous fournissez une valeur pour index, vous ne fournissez pas la value réelle (à savoir item). Je reviendrai sur cette question dans un instant.


Vous pouvez envelopper une fonction déléguée anonyme ou lambda autour du setter de propriété, par exemple (En utilisant un délégué anonyme) pour le rendre invocable:

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

ou (en utilisant une fonction lambda disponible depuis C# version 3):

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

Note: Vous créez un délégué anonyme ou lambda fonction qui accepte un argument (item). L'autre argument requis (index) provient du contexte "externe". (Le terme fermeture vient à l'esprit.) Je vois cela comme le seul moyen de changer votre dispatcher en un type délégué qui est parfois appelé avec deux arguments au lieu d'un.

Si cela est toutefois pas un problème, le code Invoke pourrait changer à .: par exemple

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

Oops, ai oublié de passer 'value' retour. Je vais essayer ça demain. Je * pensais * que je pouvais faire quelque chose comme ça, mais je ne pouvais pas me souvenir de la syntaxe appropriée. – mpen

+0

Pourquoi transmettez-vous l'élément mais pas l'index au délégué? S'il n'est pas nécessaire de passer l'index, alors il ne devrait pas être nécessaire de passer l'article non plus? 'dispatcher.Invoke (new Action (() => {this [index] = valeur;}));' – mpen

+0

En regardant le code que vous avez posté dans votre question, j'ai supposé que 'dispatcher.Invoke' nécessitait une' Action '(c'est-à-dire un délégué avec un seul paramètre). Cependant, si vous pouvez passer deux arguments, alors bien sûr, vous pourriez aussi bien passer 'index' directement au délégué. Choisissez ce qui fonctionne le mieux dans votre cas! – stakx

Questions connexes