2010-01-12 14 views
8

Mam klasy, która wykonuje działania w jego konstruktora.Jak przekazać akcję z dwoma parametrami za pomocą wyrażeń Lambda do metody?

przykład:

public CustomClass(Action<Path> insert) 
{ 

    // logic here... 

} 

Obecnie wystąpienia tej klasy, stosując następujące linie kodu:

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

że ma zmodyfikować klasę niestandardowej do dodatkowego konstruktora, takich jak:

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

    // logic here... 

} 

Jednak moja znajomość wyrażeń lambda jest dość podstawowa, więc nie może dowiedzieć się, jak utworzyć instancję klasy niestandardowej, przekazując dwa parametry w akcji do nowego konstruktora.

Każda pomoc zostanie bardzo doceniona.

Dzięki.

+1

W celu późniejszego wykorzystania, składnia różnych form wyrażenia lambda została opisana w sekcji 7.14 specyfikacji C#. –

+4

@Eric: Oczywiście wszyscy programiści C# będą już czytać specyfikację. – AnthonyWJones

Odpowiedz

11

Aby zdać 2 parametry do działania, wystarczy zdefiniować akcję insert jako Action<T,T2> i kiedy nazywają to zrobić tak:

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

Świetnie - dziękuję bardzo! – Chris

+0

Oba konstruktory nie miały być takie same - zapomniałem sformatować fragmenty kodu jako "kod", więc kiedy opublikowałem oryginalne pytanie, konstruktorzy wyglądali identycznie, więc zredagowałem ten post, aby sformatować fragmenty jako kod, a teraz konstruktorzy powinni być inni. W każdym razie Twoja odpowiedź zadziałała, więc jeszcze raz dziękuję! – Chris

+0

Cieszę się, że pomógł .. czy możesz oznaczyć jako odpowiedź i/lub głosować? Dzięki! –

6

W Lamba można przekazać dwa parametry jako takie:

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

tak, ale powinieneś również pokazać mu, jak zmienić konstruktora, aby móc zaakceptować, że 'Action' –

+0

Wierzę, że jeśli jest to złożona instrukcja, będziesz potrzebować nawiasów klamrowych wokół ciała: (x, y) => { x.DoSomething(); y.DoSomethingElse(); } – Dathan

+1

Czy jest tu brakująca para {}? – AnthonyWJones

2

albo prosisz

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

lub

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

Drugi konstruktor bierze delegata, który odbiera 2 parametry. Więc można zrobić coś takiego

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

Można tworzyć wyrażenia lambda, która trwa dłużej niż jeden parametr otaczając listę parametrów z nawiasami i przecinkami oddzielić parametry:

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

Jeśli trzeba wykonać więcej niż jednym rachunku w lambda, można otoczyć ciało lambda z szelkami:

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

Możesz dowiedzieć się więcej o lambda syntax here on MSDN.

Powiązane problemy