public static ParameterExpression[] GetExpressionParameters(Expression expr) { var paramsVisitor = new ExtractParamsVisitor(); paramsVisitor.Visit(expr); return(paramsVisitor.ParamsList.ToArray()); }
public object Eval(string expr, IDictionary <string, object> vars) { CompiledExpression compiledExpr; if (!CachedExpressions.TryGetValue(expr, out compiledExpr)) { var linqExpr = Parse(expr, vars); var paramsVisitor = new ExtractParamsVisitor(); paramsVisitor.Visit(linqExpr); compiledExpr = new CompiledExpression() { Parameters = paramsVisitor.ParamsList.ToArray() }; var lambdaExpr = Expression.Lambda(linqExpr, compiledExpr.Parameters); compiledExpr.Lambda = lambdaExpr.Compile(); lock (CachedExpressions) { CachedExpressions[expr] = compiledExpr; } } var valuesList = new List <object>(); foreach (var paramExpr in compiledExpr.Parameters) { valuesList.Add(new LambdaParameterWrapper(vars.ContainsKey(paramExpr.Name) ? vars[paramExpr.Name] : null)); } var lambdaRes = compiledExpr.Lambda.DynamicInvoke(valuesList.ToArray()); if (lambdaRes is LambdaParameterWrapper) { lambdaRes = ((LambdaParameterWrapper)lambdaRes).Value; } return(lambdaRes); }
public static ParameterExpression[] GetExpressionParameters(Expression expr) { var paramsVisitor = new ExtractParamsVisitor(); paramsVisitor.Visit(expr); return paramsVisitor.ParamsList.ToArray(); }