2010-01-12 4 views
8

Ich habe eine Klasse, die im Konstruktor eine Aktion ausführt.Wie Aktion mit zwei Parametern mit Lambda-Ausdruck an Methode übergeben?

Beispiel: mit der folgenden Codezeile

public CustomClass(Action<Path> insert) 
{ 

    // logic here... 

} 

ich diese Klasse derzeit instanziiert:

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

Ich möchte die benutzerdefinierte Klasse modifizieren, um einen zusätzlichen Konstruktor enthalten, wie die folgenden:

Allerdings ist meine Kenntnis der Lambda-Ausdrücke ziemlich einfach, also ich kann nicht herausfinden, wie die benutzerdefinierte Klasse instanziiert wird, indem zwei Parameter in der Aktion an den neuen Konstruktor übergeben werden.

Jede Hilfe würde sehr geschätzt werden.

Danke.

+1

Für Ihre zukünftige Referenz wird die Syntax für verschiedene Formen des Lambda-Ausdrucks in Abschnitt 7.14 der C# -Spezifikation beschrieben. –

+4

@Eric: Natürlich haben alle C# Entwickler die Spezifikation schon gelesen. – AnthonyWJones

Antwort

11

Um 2 Parameter an die Aktion übergeben, definieren nur den Einsatz Aktion als Action<T,T2> und wenn Sie es es wie folgt tun nennen:

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

Großartig - vielen Dank! – Chris

+0

Beide Konstruktoren sollten nicht gleich sein - ich habe vergessen, meine Code-Snippets als 'Code' zu formatieren. Als ich die ursprüngliche Frage veröffentlichte, erschienen die Konstruktoren irgendwie identisch, also habe ich den Post bearbeitet, um die Snippets als Code zu formatieren, und jetzt sollten die Konstruktoren anders sein. Wie auch immer, Ihre Antwort hat funktioniert, also nochmals vielen Dank! – Chris

+0

Ich bin froh, dass es geholfen hat. Könnten Sie als Antwort und/oder als Stimme markieren? Vielen Dank! –

6

In Lamba können Sie zwei Parameter als solche übergeben:

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

ja, aber du solltest ihm auch zeigen, wie man seinen Konstruktor ändert, um das 'Action' akzeptieren zu können. –

+0

Ich glaube, wenn es eine zusammengesetzte Aussage ist, brauchst du geschweifte Klammern um den Körper: (x, y) => { x.DoSomething(); y.DoSomethingElse(); } – Dathan

+1

Gibt es hier ein fehlendes Paar {}? – AnthonyWJones

2

Entweder Sie fragen

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

oder

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

Der zweite Konstruktor wird einen Delegaten nehmen, der 2 Parameter empfängt. So können Sie so etwas wie

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

tun können Sie einen Lambda-Ausdruck erstellen, die mit Klammern und Komma durch rund um die Parameterliste mehr als einen Parameter trennen die Parameter:

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

Wenn Sie durchführen müssen, mehr als eine Anweisung in einem Lambda, können Sie den Körper des Lambda mit geschweiften Klammern umgeben:

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

Sie mehr über lambda syntax here on MSDN lernen können.

Verwandte Themen