2013-01-12 100 views
74

我有一個lambda表達式,我希望能夠傳遞和重用。下面的代碼:C#將Lambda表達式作爲方法參數

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>(); 
    } 

這裏的關鍵,是我希望能夠通過我使用這裏成的呼喚這種代碼的方法lambda表達式,這樣我就可以重新使用。 lambda表達式是我的.Query方法中的第二個參數。我假設我想要使用一個Action或Func,但我不太確定這個語法或者它的工作原理。有人可以給我一個例子嗎?

+2

使參數的動作或函數求。 –

+0

對,這就是我想的......你能告訴我一個我如何做這個的例子嗎? –

+0

[C#lambda表達式作爲函數參數](http:// stackoverflow。com/questions/5396746/c-sharp-lambda-expressions-as-function-arguments) – user

回答

91

使用Func<T1, T2, TResult>委託作爲參數類型,並把它傳遞給你的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>(); 
    } 
} 

你會稱它爲:

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

或者拉姆達分配給一個變量,並通過 in。

+0

這看起來非常好,我將如何定義此getJobs方法的lambda外部?換句話說,調用getJobs()之前的行看起來像定義lambda? –

+0

@AdamLevitt - 與示例代碼一樣。將添加回答。 – Oded

+0

另外,函數參數可以動態嗎? –

4

Lambda表達式的類型爲Action<parameters>(如果它們不是沒有返回值)或Func<parameters,return>(以防它們具有返回值)。你的情況,你有兩個輸入參數,你需要返回一個值,所以你應該使用:

Func<FullTimeJob, Student, FullTimeJob> 
4

你應該使用一個委託類型,並指定作爲命令的參數。您可以使用其中一種內置代表類型 - ActionFunc

在你的情況下,它看起來像你的委託有兩個參數,並返回結果,所以你可以使用Func

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

然後,您可以打電話給你的GetJobs方法傳遞委託實例。這可能是匹配該簽名,匿名委託或lambda表達式的方法。

P.S.您應該使用PascalCase作爲方法名稱 - GetJobs,而不是getJobs

19

如果我明白你需要下面的代碼。 (通過參數傳遞表達拉姆達) 的方法

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 
    } 

調用方法

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

可以做同樣的在它們的類,看這是示例。

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; 
    } 

調用方法

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

我希望這是有用的

+1

你能解釋爲什麼我們需要'.Where'中的'Compile()'?我沒有看到它的作品。 –

相關問題