2010-01-12 10 views
8

Ho una classe che esegue un'azione nel suo costruttore.Come passare l'azione con due parametri usando l'espressione Lambda al metodo?

Esempio:

public CustomClass(Action<Path> insert) 
{ 

    // logic here... 

} 

Io attualmente un'istanza di questa classe utilizzando la seguente riga di codice:

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

voglio modificare la classe personalizzata per includere un costruttore aggiuntivo, come la seguente:

Tuttavia, la mia conoscenza delle espressioni lambda è piuttosto semplice, quindi non riesco a capire come istanziare la classe personalizzata, passando due parametri nell'azione al nuovo costruttore.

Qualsiasi aiuto sarebbe molto apprezzato.

Grazie.

+1

Per riferimento futuro, la sintassi per le diverse forme dell'espressione lambda è descritta nella sezione 7.14 della specifica C#. –

+4

@Eric: Ovviamente tutti gli sviluppatori C# avranno già letto le specifiche. – AnthonyWJones

risposta

11

Per passare 2 parametri all'azione, basta definire l'azione di inserimento come Action<T,T2> e quando lo si chiama fare in questo modo:

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

Grande - grazie mille! – Chris

+0

Entrambi i costruttori non erano pensati per essere uguali - ho dimenticato di formattare i frammenti di codice come 'codice', quindi quando ho postato la domanda originale, in qualche modo i costruttori sembravano identici, così ho modificato il post per formattare i frammenti come codice, e ora i costruttori dovrebbero essere diversi. In ogni caso, la tua risposta ha funzionato, quindi grazie ancora! – Chris

+0

Sono contento che abbia aiutato .. potresti contrassegnare come risposta e/o votare? Grazie! –

6

In Lamba è possibile passare due parametri come ad esempio:

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

sì, ma dovresti anche mostrargli come cambiare il suo costruttore per essere in grado di accettare quell'azione ' –

+0

Credo che se è un'istruzione composta, avrai bisogno di parentesi graffe attorno al corpo: (x, y) => { x.DoSomething(); y.DoSomethingElse(); } – Dathan

+1

C'è una coppia mancante di {} qui? – AnthonyWJones

2

o si sta chiedendo

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

o

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

Il secondo costruttore prenderà un delegato che riceve 2 parametri. Così si può fare qualcosa di simile

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

È possibile creare un'espressione lambda che richiede più di un parametro che circonda la lista dei parametri con parentesi e virgole separare i parametri:

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

Se è necessario eseguire più di una dichiarazione in un lambda, si può circondare il corpo del lambda con bretelle:

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

si può imparare di più su lambda syntax here on MSDN.

Problemi correlati