2009-07-19 4 views
8

Tout d'abord, j'utilise VS2005 et C# 2.0.Génériques C# 2.0: Comment créer un objet Action avec zéro paramètre

J'essaie de définir une propriété Text de liste déroulante à partir de l'événement SelectedIndexChanged. D'un autre thread ici sur StackOverflow cela a été proposé fait de la manière suivante:

BeginInvoke(new Action(() => someCombobox.Text = "x")); 

Maintenant, tout d'abord de tout cela renvoie une erreur du compilateur pour moi. Je crois que c'est parce que l'objet Action se comporte différemment dans les deux spécifications de langage. Dans C# 2.0, l'objet Action semble avoir besoin de la structure <T> dans toutes les déclarations. Peut-être que je me trompe, mais j'aimerais que cela soit clarifié.

Qu'est-ce que le travail est la suivante:

BeginInvoke(new Action<string>(delegate { someCombobox.Text = "x"; }), new object[] { "" }); 

Cependant, il me semble très bizarre juste que je dois définir l'objet d'action avec un paramètre de type (d'autant plus que je ne suis pas l'intention de passer tous les paramètres)! En quelque sorte supprimer ce paramètre rendrait aussi le nouvel objet vide [] obsolète, ce qui est ce que je veux.

Quelqu'un peut-il m'aider à simplifier l'appel ci-dessus?

Enfin, est-il garanti que BeginInvoke se termine après SelectedIndexChanged et donc met à jour la propriété Text de la liste déroulante avec le texte correct?

J'apprécierais vraiment d'apprendre les réponses à ces questions.

+0

L'erreur de compilation est due à l'expression lambda. Lambda sont nouveaux dans C# 3.0, et sont une forme courte de la syntaxe de création de délégué. –

Répondre

9

Je ne pense pas que l'action sans paramètres est disponible dans .NET 2.0 Pas de soucis - il suffit d'utiliser un type de délégué prédéfini différent. MethodInvoker doit effectuer le travail (méthode void sans paramètres).

En outre, BeginInvoke a 2 surcharges - une qui prend un délégué, et une qui prend un délégué et un tableau d'objets.

BeginInvoke(new MethodInvoker(delegate() 
{ 
    someCombobox.Text = "x"; 
})); 
+0

J'ai utilisé 'MethodInvoker' plusieurs fois avant que' System.Action' n'arrive. :) –

9

Vous pouvez définir votre propre délégué d'action.

delegate void Action()

Je ne vois pas l'objet sur lequel vous appelez BeginInvoke, mais si elle est un contrôle de l'interface utilisateur créée sur le même fil que le combobox, le délégué que vous passez est garanti à invoquer certains Une fois le gestionnaire d'événements SelectedIndexChanged terminé.

Questions connexes