2010-01-12 6 views
8

Tengo una clase que toma una acción en su constructor.¿Cómo pasar la acción con dos parámetros usando la expresión Lambda al método?

Ejemplo:

public CustomClass(Action<Path> insert) 
{ 

    // logic here... 

} 

actualmente instanciar esta clase mediante la siguiente línea de código:

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

I desea modificar la clase personalizada para incluir un constructor adicional, tal como la siguiente:

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

    // logic here... 

} 

Sin embargo, mi conocimiento de las expresiones lambda es bastante básico, entonces no puede averiguar cómo crear una instancia de la clase personalizada, pasando dos parámetros en la acción al nuevo constructor.

Cualquier ayuda sería muy apreciada.

Gracias.

+1

Para su futura referencia, la sintaxis para diferentes formas de la expresión lambda se describe en la sección 7.14 de la especificación C#. –

+4

@Eric: Por supuesto, todos los desarrolladores de C# ya habrán leído las especificaciones. – AnthonyWJones

Respuesta

11

el fin de pasar 2 parámetros de la acción, simplemente definir la acción de inserción como un Action<T,T2> y cuando lo llamas hacerlo de esta manera:

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

Genial, ¡muchas gracias! – Chris

+0

Ambos constructores no estaban destinados a ser iguales. Olvidé formatear mis fragmentos de código como 'código', así que cuando publiqué la pregunta original, de alguna manera los constructores parecían idénticos, así que edité la publicación para formatear los fragmentos como código. y ahora los constructores deberían ser diferentes. De todos modos, tu respuesta funcionó, ¡así que gracias de nuevo! – Chris

+0

Me alegra que haya ayudado ... ¿podría marcar como respuesta y/o votar? ¡Gracias! –

6

En Lamba puede pasar dos parámetros como tal:

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

sí, pero también debe mostrarle cómo cambiar su constructor para poder aceptar 'Action' –

+0

Creo que si es una declaración compuesta, necesitará llaves para todo el cuerpo: (x, y) => { x.DoSomething(); y.DoSomethingElse(); } – Dathan

+1

¿Falta un par de {} aquí? – AnthonyWJones

2

o se está pidiendo

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

o

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

El segundo constructor tomará un delegado que recibe 2 parámetros. Así que usted puede hacer algo como

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

Puede crear una expresión lambda que lleva más de un parámetro, que rodea a la lista de parámetros con los paréntesis y las comas separar los parámetros:

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

Si es necesario realizar más de una sentencia en un lambda, se puede rodear el cuerpo de la lambda con los apoyos:

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

usted puede aprender más sobre lambda syntax here on MSDN.

Cuestiones relacionadas