2010-01-12 21 views
8

Tôi có một lớp học có hành động trong hàm tạo của nó.Làm thế nào để vượt qua hành động với hai tham số bằng cách sử dụng biểu thức Lambda cho phương thức?

Ví dụ:

public CustomClass(Action<Path> insert) 
{ 

    // logic here... 

} 

Tôi hiện nhanh chóng lớp này bằng cách sử dụng dòng mã sau đây:

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

Tôi muốn thay đổi các lớp tùy chỉnh để bao gồm một nhà xây dựng bổ sung, chẳng hạn như sau:

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

    // logic here... 

} 

Tuy nhiên, kiến ​​thức về biểu thức lambda khá cơ bản, vì vậy tôi không thể tìm ra cách khởi tạo lớp tùy chỉnh, truyền hai tham số trong hành động tới hàm tạo mới.

Mọi trợ giúp sẽ được đánh giá cao.

Cảm ơn.

+1

Để tham khảo trong tương lai, cú pháp cho các dạng khác nhau của biểu thức lambda được mô tả trong phần 7.14 của đặc tả C#. –

+4

@Eric: Tất nhiên tất cả các nhà phát triển C# đều đã đọc thông số. – AnthonyWJones

Trả lời

11

Để vượt qua 2 thông số để hành động, chỉ cần xác định các hành động chèn như một Action<T,T2> và khi bạn gọi nó là làm điều đó như thế này:

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

Tuyệt vời - cảm ơn bạn rất nhiều! – Chris

+0

Cả hai nhà xây dựng đều không giống nhau - tôi quên định dạng đoạn mã của tôi thành 'mã', vì vậy khi tôi đăng câu hỏi gốc, bằng cách nào đó các nhà xây dựng xuất hiện giống hệt nhau, vì vậy tôi đã chỉnh sửa bài đăng để định dạng các đoạn mã dưới dạng mã, và bây giờ các nhà xây dựng nên khác nhau. Dù sao, câu trả lời của bạn đã hoạt động, vì vậy cảm ơn bạn một lần nữa! – Chris

+0

Rất vui vì nó đã giúp .. bạn có thể đánh dấu câu trả lời và/hoặc bỏ phiếu không? Cảm ơn! –

6

Trong Lamba bạn có thể vượt qua hai tham số như vậy:

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

có, nhưng bạn cũng nên chỉ cho anh ta cách thay đổi hàm tạo của mình để có thể chấp nhận rằng 'Hành động ' –

+0

Tôi tin rằng nếu đó là một câu lệnh ghép, bạn sẽ cần các dấu ngoặc nhọn quanh thân: (x, y) => { x.DoSomething(); y.DoSomethingElse(); } – Dathan

+1

Có một cặp bị thiếu {} ở đây không? – AnthonyWJones

2

hoặc bạn đang yêu cầu

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

hoặc

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

Phương thức khởi tạo thứ hai sẽ nhận một đại biểu nhận 2 tham số. Vì vậy, bạn có thể làm điều gì đó như

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

Bạn có thể tạo một biểu thức lambda mà phải mất hơn một tham số bởi xung quanh danh sách tham số với dấu ngoặc đơn và dấu phẩy tách các thông số:

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

Nếu bạn cần phải thực hiện nhiều hơn một tuyên bố trong một lambda, bạn có thể bao quanh cơ thể của lambda với niềng răng:

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

Bạn có thể tìm hiểu thêm về lambda syntax here on MSDN.

Các vấn đề liên quan