public static LambdaParser.CompiledExpression CompileExpression(this NReco.Linq.LambdaParser parser, string stringExpression)
        {
            var expression = parser.Parse(stringExpression);

            var compiledExpr = new LambdaParser.CompiledExpression()
            {
                Parameters = LambdaParser.GetExpressionParameters(expression)
            };

            var lambdaExpr = Expression.Lambda(expression, compiledExpr.Parameters);

            compiledExpr.Lambda = lambdaExpr.Compile();

            return(compiledExpr);
        }
        public static object Evaluate(this LambdaParser.CompiledExpression compiledExpression, Dictionary <string, object> values)
        {
            var valuesList = new List <object>();

            foreach (var paramExpr in compiledExpression.Parameters)
            {
                valuesList.Add(new LambdaParameterWrapper(values[paramExpr.Name]));
            }

            var lambdaRes = compiledExpression.Lambda.DynamicInvoke(valuesList.ToArray());

            if (lambdaRes is NReco.Linq.LambdaParameterWrapper)
            {
                return(((NReco.Linq.LambdaParameterWrapper)lambdaRes).Value);
            }

            return(lambdaRes);
        }