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))); }
public Func <Expression, Expression, Expression> GetInstanceCustomExpressionReducer(object key) { Func <Expression, Expression, Expression> reducer = null; if (!InstanceCustomResolverExpressionReducers.TryGetValue(key, out reducer)) { reducer = DefaultExpressionReducer; } return(reducer); }