如何评估 InstanceMethodCallExpressionN

How to evaluate InstanceMethodCallExpressionN

如何计算此二进制表达式的左侧?

Expression<Func<Person, bool>> expr = (x) => x.Birthday.AddMinutes(1) > DateTime.UtcNow;

如果我打电话给

System.Linq.Expressions.Expression.Lambda(expr.Left).Compile().DynamicInvoke() 

我收到错误消息 "variable 'x' of type '...' referenced from scope '', but it is not defined"

明确地说,我想获取 x.Birthday.AddMinutes(1) 的值,它是一个 InstanceMethodCallExpressionN

您需要从原始 lambda 中捕获参数 (x) 以创建使用该参数的新 lambda。

var lambdaExpr = Expression.Lambda(((BinaryExpression)expr.Body).Left, expr.Parameters);
var lambdaFunc = lambdaExpr.Compile();
var result = lambdaFunc.DynamicInvoke(new Person() { Birthday = DateTime.Now});
// e.g. 2/12/2020 1:39:12 PM
Console.WriteLine(result);

二进制表达式的左侧部分是 MethodCallExpression。 所以我检查并相应地投射。

private void a2()
        {
            // The original expression
            Expression<Func<Person1, bool>> expr = (x) => x.Birthday.AddMinutes(1) > DateTime.UtcNow;

            // Decompose the original expr.
            ParameterExpression param = (ParameterExpression)expr.Parameters[0];
            BinaryExpression operation = (BinaryExpression)expr.Body;
            var leftExpr = operation.Left;

            if(leftExpr is MethodCallExpression)
            {
                MethodCallExpression expression = (MethodCallExpression)leftExpr;
                object result = Expression.Lambda(expression, param).Compile().
                    DynamicInvoke(new Person1() { Birthday = DateTime.Parse("06-03-2020") });
            }
        }