示例#1
0
        public async Task <Func <TResult> > ToLambdaAsync <TResult>()
        {
            if (HasErrors())
            {
                throw new EvaluationException(Error);
            }

            if (ParsedExpression == null)
            {
                ParsedExpression = Compile(OriginalExpression, (Options & EvaluateOptions.NoCache) == EvaluateOptions.NoCache);
            }

            var visitor = new LambdaExpressionVistor(Parameters, Options);
            await ParsedExpression.AcceptAsync(visitor);

            var body = visitor.Result;

            if (body.Type != typeof(TResult))
            {
                body = System.Linq.Expressions.Expression.Convert(body, typeof(TResult));
            }

            var lambda = System.Linq.Expressions.Expression.Lambda <Func <TResult> >(body);

            return(lambda.Compile());
        }
示例#2
0
        public Func <TContext, TResult> ToLambda <TContext, TResult>() where TContext : class
        {
            if (HasErrors())
            {
                throw new EvaluationException(Error, ErrorException);
            }

            if (ParsedExpression == null)
            {
                ParsedExpression = Compile(OriginalExpression, (Options & EvaluateOptions.NoCache) == EvaluateOptions.NoCache);
            }

            var parameter = System.Linq.Expressions.Expression.Parameter(typeof(TContext), "ctx");
            var visitor   = new LambdaExpressionVistor(parameter, Options);

            ParsedExpression.Accept(visitor);

            var body = visitor.Result;

            if (body.Type != typeof(TResult))
            {
                body = System.Linq.Expressions.Expression.Convert(body, typeof(TResult));
            }

            var lambda = System.Linq.Expressions.Expression.Lambda <Func <TContext, TResult> >(body, parameter);

            return(lambda.Compile());
        }
示例#3
0
        public Func <TContext, TResult> ToLambda <TContext, TResult>()
        {
            if (HasErrors())
            {
                throw new EvaluationException(Error, ErrorException);
            }

            if (ParsedExpression == null)
            {
                ParsedExpression = Compile(OriginalExpression, (Options & EvaluateOptions.NoCache) == EvaluateOptions.NoCache);
            }

            var parameter = FastExpressionCompiler.LightExpression.Expression.Parameter(typeof(TContext), "ctx");
            var visitor   = new LambdaExpressionVistor(parameter, Options);

            visitor.EvaluateFunction  += EvaluateFunction;
            visitor.EvaluateParameter += EvaluateParameter;
            visitor.Parameters         = Parameters;

            ParsedExpression.Accept(visitor);

            var body = visitor.Result;

            if (body.Type != typeof(TResult))
            {
                body = FastExpressionCompiler.LightExpression.Expression.Convert(body, typeof(TResult));
            }

            var lambda =
                FastExpressionCompiler.LightExpression.Expression
                .Lambda <Func <TContext, TResult> >(body, parameter);

            return(lambda.CompileFast());
        }