protected override Expression VisitMember(MemberExpression node)
        {
            var parameterExpression = node.GetParameterExpression();

            if (parameterExpression == null)
            {
                var baseExpression = node.GetBaseOfMemberExpression();
                if (baseExpression?.NodeType == ExpressionType.Constant)
                {
                    return(this.Visit
                           (
                               Expression.Constant
                               (
                                   GetConstantValue
                                   (
                                       ((ConstantExpression)baseExpression).Value,
                                       node.GetPropertyFullName(),
                                       baseExpression.Type
                                   ),
                                   node.Type
                               )
                           ));
                }

                return(base.VisitMember(node));
            }

            InfoDictionary.Add(parameterExpression, TypeMappings);
            return(GetMappedMemberExpression(node.GetBaseOfMemberExpression(), new List <PropertyMapInfo>()));

            Expression GetMappedMemberExpression(Expression parentExpression, List <PropertyMapInfo> propertyMapInfoList)
            {
                Expression mappedParentExpression = this.Visit(parentExpression);

                FindDestinationFullName(parentExpression.Type, mappedParentExpression.Type, node.GetPropertyFullName(), propertyMapInfoList);

                if (propertyMapInfoList.Any(x => x.CustomExpression != null))
                {
                    var fromCustomExpression = GetMemberExpressionFromCustomExpression
                                               (
                        propertyMapInfoList,
                        propertyMapInfoList.Last(x => x.CustomExpression != null),
                        mappedParentExpression
                                               );

                    this.TypeMappings.AddTypeMapping(ConfigurationProvider, node.Type, fromCustomExpression.Type);
                    return(fromCustomExpression);
                }

                var memberExpression = GetMemberExpressionFromMemberMaps(BuildFullName(propertyMapInfoList), mappedParentExpression);

                this.TypeMappings.AddTypeMapping(ConfigurationProvider, node.Type, memberExpression.Type);

                return(memberExpression);
            }
        }
Пример #2
0
        protected override Expression VisitMember(MemberExpression node)
        {
            var parameterExpression = node.GetParameterExpression();

            if (parameterExpression == null)
            {
                return(base.VisitMember(node));
            }

            InfoDictionary.Add(parameterExpression, TypeMappings);
            return(GetMappedMemberExpression(node.GetBaseOfMemberExpression(), new List <PropertyMapInfo>()));

            Expression GetMappedMemberExpression(Expression parentExpression, List <PropertyMapInfo> propertyMapInfoList)
            {
                Expression mappedParentExpression = this.Visit(parentExpression);

                FindDestinationFullName(parentExpression.Type, mappedParentExpression.Type, node.GetPropertyFullName(), propertyMapInfoList);

                if (propertyMapInfoList.Any(x => x.CustomExpression != null))//CustomExpression takes precedence over DestinationPropertyInfo
                {
                    return(GetMemberExpression
                           (
                               new FindMemberExpressionsVisitor(mappedParentExpression),
                               GetMemberExpressionFromCustomExpression
                               (
                                   propertyMapInfoList,
                                   propertyMapInfoList.Last(x => x.CustomExpression != null),
                                   mappedParentExpression
                               )
                           ));
                }

                return(GetExpressionForInclude
                       (
                           GetMemberExpressionFromMemberMaps
                           (
                               BuildFullName(propertyMapInfoList),
                               mappedParentExpression
                           )
                       ));
            }

            Expression GetExpressionForInclude(MemberExpression memberExpression)
            => memberExpression.Type.IsLiteralType() ? memberExpression.Expression : memberExpression;

            MemberExpression GetMemberExpression(FindMemberExpressionsVisitor visitor, Expression mappedExpression)
            {
                visitor.Visit(mappedExpression);
                return(visitor.Result);
            }
        }