通过引入T的常量,将Expression<Func<T, T2, bool>>转换为Expression<Func<T2, bool>>。

6
我有一个格式为 Expression<Func<T, T2, bool>> 的表达式,我需要将其转换为格式为 Expression<Func<T2, bool>> 的表达式,方法是用一个常量值替换第一个表达式中的 T。
我需要保持这个表达式不变,所以不能只用常量作为第一个参数来调用表达式。
我已经查看了关于表达式树的其他问题,但是我无法找到解决我的问题的方案。我想我必须遍历表达式树来引入常量并删除一个参数,但目前我甚至不知道从哪里开始。 :(
1个回答

5

您可以使用Expression.Invoke创建一个调用其他lambda表达式的新lambda表达式:

static Expression<Func<T2, bool>> PartialApply<T, T2>(Expression<Func<T, T2, bool>> expr, T c)
{
    var param = Expression.Parameter(typeof(T2), null);
    return Expression.Lambda<Func<T2, bool>>(
        Expression.Invoke(expr, Expression.Constant(c), param), 
        param);
}

运行得很好,而且比完整遍历表达式三次简单得多。谢谢。 - Kristoffer L

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接