Пример #1
0
        /// <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)));
        }
Пример #2
0
        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)
 {
 }
Пример #4
0
 protected ArgumentMapper(XpressionMapperVisitor expressionVisitor, Expression argument)
 {
     this.expressionVisitor = expressionVisitor;
     this.argument          = argument;
 }
Пример #5
0
 public QuoteArgumentMapper(XpressionMapperVisitor expressionVisitor, Expression argument)
     : base(expressionVisitor, argument)
 {
 }