Exemplo n.º 1
0
        public Expression GetInstanceCustomResolverExpression(TContext context, Expression instanceExpression, object key)
        {
            ICollection <Expression <Func <TContext, T, object> > > resolvers = null;

            if (!InstanceCustomResolverExpressions.TryGetValue(key, out resolvers) || !resolvers.Any())
            {
                return(null);
            }
            var generatedResolvers = resolvers.Select(resolver => {
                var contextParameter             = resolver.Parameters[0];
                var entityParameter              = resolver.Parameters[1];
                var replacementExpressionVisitor = new ReplacementExpressionVisitor(new Dictionary <Expression, Expression>()
                {
                    { contextParameter, Expression.Constant(context) },
                    { entityParameter, instanceExpression }
                });
                return(replacementExpressionVisitor.Visit(resolver.Body));
            });

            var firstExpression = generatedResolvers.First();

            if (!generatedResolvers.Skip(1).Any())
            {
                return(firstExpression);
            }
            Func <Expression, Expression, Expression> reducer = null;

            if (!InstanceCustomResolverExpressionReducers.TryGetValue(key, out reducer))
            {
                reducer = DefaultExpressionReducer;
            }
            return(generatedResolvers.Skip(1).Aggregate(firstExpression, (expression, resolver) => reducer(expression, resolver)));
        }
Exemplo n.º 2
0
        public Func <Expression, Expression, Expression> GetInstanceCustomExpressionReducer(object key)
        {
            Func <Expression, Expression, Expression> reducer = null;

            if (!InstanceCustomResolverExpressionReducers.TryGetValue(key, out reducer))
            {
                reducer = DefaultExpressionReducer;
            }
            return(reducer);
        }