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); } }
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); } }