2009-08-01 41 views
42

我有一个接受Expression<Func<T, bool>>作为参数的方法。我想将它用作List.Find()方法中的谓词,但似乎无法将其转换为List所需的谓词。你知道一个简单的方法来做到这一点?如何将表达式<Func <T, bool>>转换为谓词<T>

public IList<T> Find<T>(Expression<Func<T, bool>> expression) where T : class, new() 
{ 
    var list = GetList<T>(); 

    var predicate = [what goes here to convert expression?]; 

    return list.Find(predicate); 
} 

更新

结合从tvanfosson和280Z28答案,我现在使用的是这样的:

public IList<T> Find<T>(Expression<Func<T, bool>> expression) where T : class, new() 
{ 
    var list = GetList<T>(); 

    return list.Where(expression.Compile()).ToList(); 
} 

回答

46
Func<T, bool> func = expression.Compile(); 
Predicate<T> pred = t => func(t); 

编辑:按照意见,我们有第二个更好的答案line:

Predicate<T> pred = func.Invoke; 
+0

完美!谢谢! – 2009-08-01 23:58:50

+7

或者:pred = func.Invoke; – 2009-08-01 23:59:58

+0

是的,func.Invoke看起来更好。 – 2009-08-02 00:05:29

25

我看不到这种方法的必要性。只需使用Where()。

var sublist = list.Where(expression.Compile()).ToList(); 

甚至更​​好,将表达式定义为lambda内联。

var sublist = list.Where(l => l.ID == id).ToList(); 
22

尚未提到的另一个选项:

Func<T, bool> func = expression.Compile(); 
Predicate<T> predicate = new Predicate<T>(func); 

这产生相同的IL作为

Func<T, bool> func = expression.Compile(); 
Predicate<T> predicate = func.Invoke; 
相关问题