/// <summary> /// Maps an expression given a dictionary of types where the source type is the key and the destination type is the value. /// </summary> /// <typeparam name="TDestDelegate"></typeparam> /// <param name="mapper"></param> /// <param name="expression"></param> /// <returns></returns> public static TDestDelegate MapExpression <TDestDelegate>(this IMapper mapper, LambdaExpression expression) where TDestDelegate : LambdaExpression { if (expression == null) { return(default(TDestDelegate)); } if (expression.GetType().GetGenericTypeDefinition() != typeof(Expression <>) || typeof(TDestDelegate).GetGenericTypeDefinition() != typeof(Expression <>)) { throw new ArgumentException(Resource.mustBeExpressions); } var typeSourceFunc = expression.GetType().GetGenericArguments()[0]; var typeDestFunc = typeof(TDestDelegate).GetGenericArguments()[0]; var typeMappings = new Dictionary <Type, Type>() .AddTypeMappingsFromDelegates(typeSourceFunc, typeDestFunc); var visitor = new XpressionMapperVisitor(mapper == null ? Mapper.Configuration : mapper.ConfigurationProvider, typeMappings); var remappedBody = visitor.Visit(expression.Body); if (remappedBody == null) { throw new InvalidOperationException(Resource.cantRemapExpression); } return((TDestDelegate)Lambda(typeDestFunc, remappedBody, expression.GetDestinationParameterExpressions(visitor.InfoDictionary, typeMappings))); }
public static ArgumentMapper Create(XpressionMapperVisitor expressionVisitor, Expression argument) { switch (argument.NodeType) { case ExpressionType.Lambda: return(new LambdaArgumentMapper(expressionVisitor, argument)); case ExpressionType.Quote: return(new QuoteArgumentMapper(expressionVisitor, argument)); default: return(new DefaultArgumentMapper(expressionVisitor, argument)); } }
public DefaultArgumentMapper(XpressionMapperVisitor expressionVisitor, Expression argument) : base(expressionVisitor, argument) { }
protected ArgumentMapper(XpressionMapperVisitor expressionVisitor, Expression argument) { this.expressionVisitor = expressionVisitor; this.argument = argument; }
public QuoteArgumentMapper(XpressionMapperVisitor expressionVisitor, Expression argument) : base(expressionVisitor, argument) { }