2010-01-12 4 views
8

J'ai une classe qui prend une action dans son constructeur.Comment passer une action avec deux paramètres en utilisant l'expression Lambda à la méthode?

Exemple:

public CustomClass(Action<Path> insert) 
{ 

    // logic here... 

} 

J'instancier actuellement cette classe en utilisant la ligne de code suivante:

var custom = new CustomClass((o) => LayoutRoot.Children.Add(o)); 

Je veux modifier la classe personnalisée pour inclure un constructeur supplémentaire, comme ce qui suit:

public CustomClass(Action<Path, TextBlock> insert) 
{ 

    // logic here... 

} 

Cependant, ma connaissance des expressions lambda est assez basique, donc je ne peut pas comprendre comment instancier la classe personnalisée, en passant deux paramètres dans l'action au nouveau constructeur.

Toute aide serait grandement appréciée.

Merci.

+1

Pour votre future référence, la syntaxe des différentes formes de l'expression lambda est décrite dans la section 7.14 de la spécification C#. –

+4

@Eric: Bien sûr, tous les développeurs C# auront déjà lu la spécification. – AnthonyWJones

Répondre

11

Pour passer 2 paramètres à l'action, il suffit de définir l'action d'insertion comme Action<T,T2> et quand vous l'appelez le faire comme ceci:

var custom = new CustomClass((o,u) => {LayoutRoot.Children.Add(o); somethingElse(u)}); 
+0

Great - merci beaucoup! – Chris

+0

Les deux constructeurs n'étaient pas censés être les mêmes - j'ai oublié de formater mes extraits de code en 'code', donc quand j'ai posté la question originale, les constructeurs semblaient identiques, donc j'ai édité le post pour mettre en forme les snippets, et maintenant les constructeurs devraient être différents. Quoi qu'il en soit, votre réponse a fonctionné, alors merci encore! – Chris

+0

Je suis content que cela vous a aidé .. pourriez-vous marquer comme réponse et/ou voter? Merci! –

6

En Lamba vous pouvez passer deux paramètres en tant que tels:

(x, y) => { x.DoSomething(); y.DoSomethingElse(); } 
+1

oui, mais vous devriez aussi lui montrer comment changer son constructeur pour pouvoir accepter que 'Action' –

+0

Je crois que s'il s'agit d'une instruction composée, vous aurez besoin d'accolades autour du corps: (x, y) => { x.DoSomething(); y.DoSomethingElse(); } – Dathan

+1

Y a-t-il une paire de {} manquante ici? – AnthonyWJones

2

Soit vous demandez

public CustomClass(Action insert, Action insert2) { // logic here... } 

ou

public CustomClass(Action<T1, T2> insert) { // logic here... } 

Le deuxième constructeur prendra un délégué qui recevra 2 paramètres. Ainsi, vous pouvez faire quelque chose comme

CustomClass class = new CustomClass((x,y) => DoSomething(x,y)); 
2

Vous pouvez créer une expression lambda qui prend plus d'un paramètre en entourant la liste des paramètres avec des parenthèses et des virgules séparer les paramètres:

var custom = new CustomClass((o, tb) => /* use both params somehow */); 

Si vous devez effectuer plus d'une instruction dans une lambda, vous pouvez entourer le corps du lambda avec des accolades:

var custom = new CustomClass((o, tb) => { o.DoSomething(); tb.DoSomethingElse() }); 

vous pouvez en savoir plus sur lambda syntax here on MSDN.

Questions connexes