Cómo convertir una expresión < Func < T, bool > > a un predicado < T >
-
10-07-2019 - |
Pregunta
Tengo un método que acepta una Expresión < Func < T, bool > >
como parámetro. Me gustaría usarlo como un predicado en el método List.Find (), pero parece que no puedo convertirlo en un predicado que toma List. ¿Conoces una manera simple de hacer esto?
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);
}
Update
Combinando respuestas de tvanfosson y 280Z28, ahora estoy usando esto:
public IList<T> Find<T>(Expression<Func<T, bool>> expression) where T : class, new()
{
var list = GetList<T>();
return list.Where(expression.Compile()).ToList();
}
Solución
Func<T, bool> func = expression.Compile();
Predicate<T> pred = t => func(t);
Editar: según los comentarios tenemos una mejor respuesta para la segunda línea:
Predicate<T> pred = func.Invoke;
Otros consejos
No veo la necesidad de este método. Simplemente use Where ().
var sublist = list.Where( expression.Compile() ).ToList();
O incluso mejor, defina la expresión como una lambda en línea.
var sublist = list.Where( l => l.ID == id ).ToList();
Otras opciones que no se han mencionado:
Func<T, bool> func = expression.Compile();
Predicate<T> predicate = new Predicate<T>(func);
Esto genera la misma IL que
Func<T, bool> func = expression.Compile();
Predicate<T> predicate = func.Invoke;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow