2013-01-12 31 views
74

Tôi có biểu thức lambda mà tôi muốn có thể truyền và sử dụng lại. Dưới đây là các mã:C# Vượt qua biểu thức Lambda như tham số phương thức

public List<IJob> getJobs(/* i want to pass the lambda expr in here */) { 
    using (SqlConnection connection = new SqlConnection(getConnectionString())) { 
    connection.Open(); 
    return connection.Query<FullTimeJob, Student, FullTimeJob>(sql, 
     (job, student) => {   
     job.Student = student; 
     job.StudentId = student.Id; 
     return job; 
     }, 
     splitOn: "user_id", 
     param: parameters).ToList<IJob>(); 
    } 

Mấu chốt ở đây, là tôi muốn để có thể vượt qua các biểu thức lambda mà tôi đang sử dụng ở đây vào phương pháp mà đang gọi mã này, vì vậy tôi có thể tái sử dụng nó. Biểu thức lambda là đối số thứ hai bên trong phương thức .Query của tôi. Tôi giả sử tôi muốn sử dụng một hành động hoặc Func, nhưng tôi không hoàn toàn chắc chắn cú pháp là gì cho điều này hoặc làm thế nào nó khá hoạt động. Có thể ai đó xin vui lòng cho tôi một ví dụ?

+2

Hãy tham số một hành động hoặc một Func Calling. –

+0

Phải, đó là những gì tôi nghĩ ... bạn có thể chỉ cho tôi một ví dụ về cách tôi sẽ làm điều này? –

+0

có thể trùng lặp của [biểu thức lambda C# dưới dạng đối số hàm] (http: // stackoverflow.com/questions/5396746/c-sharp-lambda-expressions-as-function-argument) – user

Trả lời

91

Sử dụng một đại biểu Func<T1, T2, TResult> như kiểu tham số và vượt qua nó để bạn Query:

public List<IJob> getJobs(Func<FullTimeJob, Student, FullTimeJob> lambda) 
{ 
    using (SqlConnection connection = new SqlConnection(getConnectionString())) { 
    connection.Open(); 
    return connection.Query<FullTimeJob, Student, FullTimeJob>(sql, 
     lambda, 
     splitOn: "user_id", 
     param: parameters).ToList<IJob>(); 
    } 
} 

Bạn sẽ gọi nó là:

getJobs((job, student) => {   
     job.Student = student; 
     job.StudentId = student.Id; 
     return job; 
     }); 

Hoặc giao lambda cho một biến và vượt qua in.

+0

Điều này có vẻ rất tốt, và làm thế nào tôi sẽ xác định bên ngoài lambda của phương thức getJobs này? Nói cách khác, dòng trước khi gọi hàm getJobs() trông như thế nào để định nghĩa lambda? –

+0

@AdamLevitt - Giống như cách bạn có với mã ví dụ của mình. Sẽ thêm vào câu trả lời. – Oded

+0

Ngoài ra, các tham số chức năng có thể hoạt động không? –

4

Biểu thức Lambda có loại Action<parameters> (trong trường hợp chúng không không trả lại giá trị) hoặc Func<parameters,return> (trong trường hợp chúng có giá trị trả lại). Trong trường hợp của bạn, bạn có hai thông số đầu vào, và bạn cần phải trả lại một giá trị, vì vậy bạn nên sử dụng:

Func<FullTimeJob, Student, FullTimeJob> 
4

Bạn nên sử dụng một loại đại biểu và xác định đó là tham số lệnh của bạn. Bạn có thể sử dụng một trong các loại đại biểu được tạo sẵn - ActionFunc.

Trong trường hợp của bạn, có vẻ như đại biểu của bạn có hai tham số, và trả về một kết quả, vì vậy bạn có thể sử dụng Func:

List<IJob> GetJobs(Func<FullTimeJob, Student, FullTimeJob> projection) 

Sau đó, bạn có thể gọi phương thức GetJobs bạn đi qua trong một thể hiện ủy nhiệm. Đây có thể là một phương thức khớp với chữ ký đó, một đại biểu ẩn danh, hoặc một biểu thức lambda.

P.S. Bạn nên sử dụng PascalCase cho tên phương thức - GetJobs, không phải getJobs.

19

Nếu tôi hiểu bạn cần mã sau đây. (Thông qua biểu thức lambda bởi tham số) Phương pháp

public static void Method(Expression<Func<int, bool>> predicate) { 
    int[] number={1,2,3,4,5,6,7,8,9,10}; 
    var newList = from x in number 
        .Where(predicate.Compile()) //here compile your clausuly 
        select x; 
       newList.ToList();//return a new list 
    } 

gọi method

Method(v => v.Equals(1)); 

Bạn có thể làm điều tương tự trong lớp học của họ, xem đây là ví dụ.

public string Name {get;set;} 

public static List<Class> GetList(Expression<Func<Class, bool>> predicate) 
    { 
     List<Class> c = new List<Class>(); 
     c.Add(new Class("name1")); 
     c.Add(new Class("name2")); 

     var f = from g in c. 
       Where (predicate.Compile()) 
       select g; 
     f.ToList(); 

     return f; 
    } 

phương pháp

Class.GetList(c=>c.Name=="yourname"); 

Tôi hy vọng điều này rất hữu ích

+1

Bạn có thể giải thích tại sao chúng ta cần 'Biên dịch() 'trong' .Where'? Tôi đã thấy nó hoạt động mà không có quá. –

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