我有一个项目列表,我想通过表达式,使用我自己的自定义函数过滤掉项目。
类似这样的事情
return Items.Where(Foo)
private static bool Foo(Item item) { item.Name.Equals("...");
我现在拥有什么
public static Expression BuildExpression(IList<Item> items)
{
Expression<Func<Item, bool>> expression = item => Foo(item);
var method = (expression.Body as MethodCallExpression)?.Method;
return Expression.Call(method, Expression.Constant(items.First());
}
这似乎适用于 1 项目,但我不知道如何更改它以适用于
IList<Item>
P.s
Foo
如有需要可以更改签名
Enumerable.Where<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>)
方法。例如:
// find the Enumerable.Where with 2 parameters using reflection
var where = typeof(Enumerable).GetMethod(nameof(Enumerable.Where), BindingFlags.Public | BindingFlags.Static, new[]
{
typeof(IEnumerable<>).MakeGenericType(Type.MakeGenericMethodParameter(0)),
typeof(Func<,>).MakeGenericType(Type.MakeGenericMethodParameter(0), typeof(bool))
});
// make generic Enumerable.Where<Item>
var whereItem = where.MakeGenericMethod(typeof(Item));
// sample data
IList<Item> items = new List<Item> { new() };
// sample filter
var filter = (Item i) => true;
// create expression
var expr = Expression.Call(whereItem, Expression.Constant(items), Expression.Constant(filter));
// validate
var enumerable = Expression.Lambda<Func<IEnumerable<Item>>>(expr).Compile()();