Обычно вы можете использовать этот метод для оценки лямбда-выражения (и передачи):
protected object EvaluateExpression(Expression expression)
{
var lambda = Expression.Lambda(expression);
var compiled = lambda.Compile();
var value = compiled.DynamicInvoke(null);
return value;
}
Однако в вашем случае это не сработает, потому что выражение, которое вы пытаетесь оценить, зависит от x
, которое не может быть оценено, если вы не укажете для него конкретное значение, как предложил Wiktor.
Чтобы указать значение параметра, необходимо изменить метод следующим образом:
protected static object EvaluateExpression(Expression expression, ParameterExpression parameterX)
{
var lambda = Expression.Lambda(expression, parameterX);
var compiled = lambda.Compile();
return compiled.DynamicInvoke(5);
// 5 here is the actual parameter value. change it to whatever you wish
}
Эта версия метода, однако, должна принимать в качестве параметра объект ExpressionParameter, который представляет x
в вашем выражении, чтобы он знал, что делать со значением, переданным DynamicInvoke()
.
Чтобы получить соответствующий ExpressionParameter
объект, вам нужен доступ к корневому выражению, а не к одному из его узлов, поэтому я думаю, что было бы неловко делать это в посетителе.