web-dev-qa-db-fra.com

Comment convertir une expression <Func <T, bool >> en un prédicat <T>

J'ai une méthode qui accepte un Expression<Func<T, bool>> comme paramètre. Je voudrais l'utiliser comme prédicat dans la méthode List.Find (), mais je n'arrive pas à le convertir en un prédicat que prend List. Connaissez-vous un moyen simple de procéder?

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

Mise à jour

Combinant les réponses de tvanfosson et 280Z28, j'utilise maintenant ceci:

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
Lance Fisher
Func<T, bool> func = expression.Compile();
Predicate<T> pred = t => func(t);

Edit: d'après les commentaires, nous avons une meilleure réponse pour la deuxième ligne:

Predicate<T> pred = func.Invoke;
53
Sam Harwell

Je ne vois pas la nécessité de cette méthode. Utilisez simplement Where ().

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

Ou encore mieux, définissez l'expression comme une ligne lambda.

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

Une autre option qui n'a pas été mentionnée:

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

Cela génère le même IL que

Func<T, bool> func = expression.Compile();
Predicate<T> predicate = func.Invoke;
25
Jon Skeet