Expression.使用自定义函数调用数组

问题描述 投票:0回答:1

我有一个项目列表,我想通过表达式,使用我自己的自定义函数过滤掉项目。

类似这样的事情

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
如有需要可以更改签名

c# linq lambda expression-trees
1个回答
0
投票

简而言之,您需要找到

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()();
© www.soinside.com 2019 - 2024. All rights reserved.