Как оценить InstanceMethodCallExpressionN - PullRequest
1 голос
/ 12 февраля 2020

Как мне оценить левую часть этого двоичного выражения?

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

Если я вызываю

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

, я получаю сообщение об ошибке "переменная" x "типа '...' ссылка из области действия '', но она не определена "

Чтобы было ясно, я хочу получить значение x.Birthday.AddMinutes (1), которое является InstanceMethodCallExpressionN

Ответы [ 2 ]

0 голосов
/ 14 февраля 2020

Левая часть двоичного выражения представляет собой выражение 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") });
            }
        }
0 голосов
/ 12 февраля 2020

Вам нужно захватить параметр (x) из исходной лямбды, чтобы создать новую лямбду, использующую этот параметр.

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);
...