如何评估 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") });
}
}
如何计算此二进制表达式的左侧?
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") });
}
}