2011-11-06 85 views
2

我想創建一個方法,它允許傳遞一個lambda表達式作爲參數。例如Lambda作爲參數

List<T> Select<T>(Predicate<T> criteria) 
{ 
    ... 
} 

這個想法是,表達式中發生的字段和值可以在此方法中恢復。

用法的一個例子是:

List<Contact> list = Select<Contact>(c => c.Id == 1); 

我如何表達的字段和值

這樣

string field = something here that you retrieve in this case Id 
object value = something here make retrieve id here. 

對不起,我的英語,我的母語是西班牙語。謝謝你和問候。

+0

您的問題的答案將取決於語言。你真的應該告訴我們你正在使用什麼語言,併爲它添加一個標籤。 –

回答

2

如果要使用lambda表達式作爲參數,則應該將參數類型設置爲Expression<Func<T,TResult>>Func<T,TResult>,具體取決於您是否希望將表達式轉換爲SQL。例如,

public List<T> Select<T>(Expression<Func<T,bool>> selector) 
{ 
     return db.GetTable<T>().Where(selector); 
} 

注意,有不一定需要評估或直接檢查表達式,如果你只是要在需要表達類型的上下文中使用它。

3

一些評論

public class LinqAsParameter 
{ 
    public class Dummy 
    { 
     public string Name { get; set; } 
     public int Age { get; set; } 
    } 

    public void Test() 
    { 
     var dummies = new List<Dummy> 
     { 
      new Dummy { Name = "Jon", Age = 30 }, 
      new Dummy { Name = "Will", Age = 27 }, 
     }; 

     // Calling the custom select method 
     IEnumerable<int> ages = dummies.CustomSelect(o => o.Age); 
    } 
} 

// extension class 
public static class IEnumerableExtenderLinqAsParameter 
{ 
    // extension method 
    public static IEnumerable<TResult> CustomSelect<TSource, TResult>(
     this IEnumerable<TSource> e 
     , Expression<Func<TSource, TResult>> exp) 
    { 
     // from the MemberExpression you can get the Member name 
     var memberExpression = exp.Body as MemberExpression; 
     var field = memberExpression.Member.Name; // name 
     var compiledExp = exp.Compile(); // compiling the exp to execute 
             // and retrieve the resulting value 

     // run the list an get the value for each item 
     foreach (TSource item in e) 
     { 
      yield return compiledExp(item); 
     } 
    } 
} 

您可能會發現喬恩斯基特的帖子中有用的CustomSelect的例子:Reimplementing LINQ to Objects: Part 3 - "Select"

從MSDN一些參考: