Example #1
0
        public Expression MapExpression(IConfigurationProvider configurationProvider, ProfileMap profileMap,
                                        IMemberMap memberMap, Expression sourceExpression, Expression destExpression,
                                        Expression contextExpression)
        {
            var destinationType     = destExpression.Type;
            var destinationEnumType = ElementTypeHelper.GetEnumerationType(destinationType);
            var enumParse           = Expression.Call(typeof(Enum), "Parse", null, Expression.Constant(destinationEnumType),
                                                      sourceExpression, Expression.Constant(true));
            var switchCases = new List <SwitchCase>();
            var enumNames   = destinationEnumType.GetDeclaredMembers();

            foreach (var memberInfo in enumNames.Where(x => x.IsStatic()))
            {
                var attribute = memberInfo.GetCustomAttribute(typeof(EnumMemberAttribute)) as EnumMemberAttribute;
                if (attribute?.Value != null)
                {
                    var switchCase = Expression.SwitchCase(
                        ToType(Expression.Constant(Enum.ToObject(destinationEnumType, memberInfo.GetMemberValue(null))),
                               destinationType), Expression.Constant(attribute.Value));
                    switchCases.Add(switchCase);
                }
            }
            var equalsMethodInfo = Method(() => StringCompareOrdinalIgnoreCase(null, null));
            var switchTable      = switchCases.Count > 0
                ? Expression.Switch(sourceExpression, ToType(enumParse, destinationType), equalsMethodInfo, switchCases)
                : ToType(enumParse, destinationType);
            var isNullOrEmpty = Expression.Call(typeof(string), "IsNullOrEmpty", null, sourceExpression);

            return(Expression.Condition(isNullOrEmpty, Expression.Default(destinationType), switchTable));
        }
Example #2
0
        public static Expression ContextMap(TypePair typePair, Expression sourceParameter, Expression contextParameter,
                                            Expression destinationParameter, IMemberMap memberMap)
        {
            var mapMethod = ContextMapMethod.MakeGenericMethod(typePair.SourceType, typePair.DestinationType);

            return(Call(contextParameter, mapMethod, sourceParameter, destinationParameter, Constant(memberMap, typeof(IMemberMap))));
        }
Example #3
0
        public Expression MapExpression(IConfigurationProvider configurationProvider, ProfileMap profileMap,
                                        IMemberMap memberMap, Expression sourceExpression, Expression destExpression, Expression contextExpression)
        {
            var implicitOperator = GetImplicitConversionOperator(new TypePair(sourceExpression.Type, destExpression.Type));

            return(Expression.Call(null, implicitOperator, sourceExpression));
        }
Example #4
0
        private ExpressionResolutionResult ResolveExpression(IMemberMap propertyMap, Type currentType, Expression instanceParameter, LetPropertyMaps letPropertyMaps)
        {
            var result = new ExpressionResolutionResult(instanceParameter, currentType);
            var matchingExpressionConverter = _configurationProvider.ResultConverters.FirstOrDefault(c => c.CanGetExpressionResolutionResult(result, propertyMap));

            if (matchingExpressionConverter == null)
            {
                ThrowCannotMap(propertyMap, result);
                return(null);
            }
            result = matchingExpressionConverter.GetExpressionResolutionResult(result, propertyMap, letPropertyMaps);
            if (propertyMap.NullSubstitute != null && result.Type.IsNullableType())
            {
                var currentChild     = result.ResolutionExpression;
                var currentChildType = result.Type;
                var nullSubstitute   = propertyMap.NullSubstitute;

                var newParameter = result.ResolutionExpression;
                var converter    = new NullSubstitutionConversionVisitor(newParameter, nullSubstitute);

                currentChild     = converter.Visit(currentChild);
                currentChildType = currentChildType.GetTypeOfNullable();

                return(new ExpressionResolutionResult(currentChild, currentChildType));
            }

            return(result);
        }
        public ExpressionResolutionResult GetExpressionResolutionResult(
            ExpressionResolutionResult expressionResolutionResult, IMemberMap propertyMap, LetPropertyMaps letPropertyMaps)
        {
            var mapFrom = propertyMap.CustomMapExpression;

            if (!IsSubQuery() || letPropertyMaps.ConfigurationProvider.ResolveTypeMap(propertyMap.SourceType, propertyMap.DestinationType) == null)
            {
                return(new ExpressionResolutionResult(mapFrom.ReplaceParameters(propertyMap.CheckCustomSource(expressionResolutionResult, letPropertyMaps))));
            }
            if (propertyMap.CustomSource == null)
            {
                return(new ExpressionResolutionResult(letPropertyMaps.GetSubQueryMarker(mapFrom), mapFrom));
            }
            var newMapFrom = Lambda(mapFrom.ReplaceParameters(propertyMap.CustomSource.Body), propertyMap.CustomSource.Parameters);

            return(new ExpressionResolutionResult(letPropertyMaps.GetSubQueryMarker(newMapFrom), newMapFrom));

            bool IsSubQuery()
            {
                if (!(mapFrom.Body is MethodCallExpression methodCall))
                {
                    return(false);
                }
                var method = methodCall.Method;

                return(method.IsStatic && method.DeclaringType == typeof(Enumerable));
            }
        }
Example #6
0
 public MapRequest(TypePair requestedTypes, TypePair runtimeTypes, ITypeMapConfiguration inlineConfig, IMemberMap memberMap = null)
 {
     RequestedTypes = requestedTypes;
     RuntimeTypes   = runtimeTypes;
     InlineConfig   = inlineConfig;
     MemberMap      = memberMap;
 }
Example #7
0
        public static Expression NullCheckSource(ProfileMap profileMap,
                                                 Expression sourceParameter,
                                                 Expression destinationParameter,
                                                 Expression objectMapperExpression,
                                                 IMemberMap memberMap)
        {
            var declaredDestinationType = destinationParameter.Type;
            var destinationType         = objectMapperExpression.Type;
            var defaultDestination      = DefaultDestination(destinationType, declaredDestinationType, profileMap);
            var destination             = memberMap == null
                ? destinationParameter.IfNullElse(defaultDestination, destinationParameter)
                : memberMap.UseDestinationValue.GetValueOrDefault() ? destinationParameter : defaultDestination;

            var ifSourceNull = destinationParameter.Type.IsCollectionType() ? ClearDestinationCollection() : destination;

            return(sourceParameter.IfNullElse(ifSourceNull, objectMapperExpression));

            Expression ClearDestinationCollection()
            {
                var destinationElementType    = ElementTypeHelper.GetElementType(destinationParameter.Type);
                var destinationCollectionType = typeof(ICollection <>).MakeGenericType(destinationElementType);
                var destinationVariable       = Variable(destinationCollectionType, "collectionDestination");
                var clear      = Call(destinationVariable, destinationCollectionType.GetDeclaredMethod("Clear"));
                var isReadOnly = Property(destinationVariable, "IsReadOnly");

                return(Block(new[] { destinationVariable },
                             Assign(destinationVariable, ExpressionFactory.ToType(destinationParameter, destinationCollectionType)),
                             Condition(OrElse(Equal(destinationVariable, Constant(null)), isReadOnly), Empty(), clear),
                             destination));
            }
        }
Example #8
0
 private static object PrimaryParameter(IMemberMap member)
 {
     return(new
     {
         member.Ssn,
     });
 }
Example #9
0
 private ValidationContext(TypePair types, IMemberMap memberMap, IObjectMapper objectMapper, TypeMap typeMap)
 {
     ObjectMapper = objectMapper;
     TypeMap      = typeMap;
     Types        = types;
     MemberMap    = memberMap;
 }
        public static EventBrokerResolvedType ResolveType(IMemberMap<EventInfo> memberMap, TypeBuilder typeBuilder)
        {
            Type[] @params = null;
            Type delegateType = null;
            Type[] delegateParameters = null;
            var @event = memberMap.ContractMember;
            var declaringType = memberMap.ContractType;
            var invokeMethod = @event.GetInvokeMethod();
            var invokeReturnType = invokeMethod.ReturnType;
            var eventBrokerResolvedType = new EventBrokerResolvedType(@event) {
                DecalringType = declaringType
            };

            if (invokeMethod.GetDelegateParams(out @params, out delegateParameters)) {
                delegateType = @params.GetDelegateType(true);
                eventBrokerResolvedType.EventInterceptionContractArgs = @event.ToEventArgumentContract(@params);
                eventBrokerResolvedType.EventInterceptionArgs = declaringType.MakeGenericFunctionAspectArgsEvent(@params);
                eventBrokerResolvedType.EventBrokerBaseClassType = declaringType.MakeGenericEventBrokerBaseClassFunctionBinding(@params);
                eventBrokerResolvedType.EventBrokerInvokeDelegateType = typeof(Func<,>).MakeGenericType(new[] { eventBrokerResolvedType.EventInterceptionContractArgs, invokeReturnType });
            }
            else {
                delegateType = delegateParameters.GetDelegateType(false);
                eventBrokerResolvedType.EventInterceptionContractArgs = @event.ToEventArgumentContract(delegateParameters);
                eventBrokerResolvedType.EventInterceptionArgs = declaringType.MakeGenericActionAspectArgsEvent(delegateParameters);
                eventBrokerResolvedType.EventBrokerBaseClassType = declaringType.MakeGenericEventBrokerBaseClassActionType(delegateParameters);
                eventBrokerResolvedType.EventBrokerInvokeDelegateType = typeof(Action<>).MakeGenericType(new[] { eventBrokerResolvedType.EventInterceptionContractArgs });
            }

            eventBrokerResolvedType.Arguments = delegateParameters;
            eventBrokerResolvedType.EventBrokerFieldType = typeof(IEventBroker<>).MakeGenericType(delegateType);

            return eventBrokerResolvedType;
        }
        private static void ThrowCannotMap(IMemberMap propertyMap, ExpressionResolutionResult result)
        {
            var message =
                $"Unable to create a map expression from {propertyMap.SourceMember?.DeclaringType?.Name}.{propertyMap.SourceMember?.Name} ({result.Type}) to {propertyMap.DestinationType.Name}.{propertyMap.DestinationName} ({propertyMap.DestinationType})";

            throw new AutoMapperMappingException(message, null, propertyMap.TypeMap.Types, propertyMap.TypeMap, propertyMap);
        }
Example #12
0
        public static Parameter GetParameter(Type entityType, ISqlGenerator sqlGenerator, string propertyName, object value)
        {
            IClassMapper map = sqlGenerator.Configuration.GetMap(entityType);

            if (map == null)
            {
                throw new NullReferenceException(String.Format("Map was not found for {0}", entityType));
            }

            IMemberMap propertyMap = map.Properties.SingleOrDefault(p => p.Name == propertyName);

            if (propertyMap == null)
            {
                throw new NullReferenceException(String.Format("{0} was not found for {1}", propertyName, entityType));
            }

            return(new Parameter
            {
                ColumnName = propertyMap.ColumnName,
                DbType = propertyMap.DbType,
                ParameterDirection = propertyMap.DbDirection,
                Precision = propertyMap.DbPrecision,
                Scale = propertyMap.DbScale,
                Size = propertyMap.DbSize,
                Value = value is Func <object>?(value as Func <object>).Invoke() : value,
                            Name = propertyName
            });
        }
Example #13
0
        public static Expression MapExpression(IConfigurationProvider configurationProvider,
                                               ProfileMap profileMap,
                                               TypePair typePair,
                                               Expression sourceParameter,
                                               Expression contextParameter,
                                               IMemberMap propertyMap = null, Expression destinationParameter = null)
        {
            if (destinationParameter == null)
            {
                destinationParameter = Default(typePair.DestinationType);
            }
            var typeMap = configurationProvider.ResolveTypeMap(typePair);

            if (typeMap != null)
            {
                if (!typeMap.HasDerivedTypesToInclude())
                {
                    typeMap.Seal(configurationProvider);

                    return(typeMap.MapExpression != null
                        ? typeMap.MapExpression.ConvertReplaceParameters(sourceParameter, destinationParameter,
                                                                         contextParameter)
                        : ContextMap(typePair, sourceParameter, contextParameter, destinationParameter, propertyMap));
                }
                return(ContextMap(typePair, sourceParameter, contextParameter, destinationParameter, propertyMap));
            }
            var objectMapperExpression = ObjectMapperExpression(configurationProvider, profileMap, typePair,
                                                                sourceParameter, contextParameter, propertyMap, destinationParameter);
            var nullCheckSource = NullCheckSource(profileMap, sourceParameter, destinationParameter, objectMapperExpression, propertyMap);

            return(ExpressionFactory.ToType(nullCheckSource, typePair.DestinationType));
        }
        public Expression MapExpression(IConfigurationProvider configurationProvider, ProfileMap profileMap,
                                        IMemberMap memberMap, Expression sourceExpression, Expression destExpression, Expression contextExpression)
        {
            var typeMap = new TypePair(sourceExpression.Type, destExpression.Type);

            return(_converters[typeMap].Value.ReplaceParameters(sourceExpression));
        }
Example #15
0
 internal void Add(XName name, IMemberMap <T> map)
 {
     if (_list.ContainsKey(name))
     {
         throw new MappingException("'{0}' has been already mapped.".F(name));
     }
     _list.Add(name, map);
 }
            public Expression MapExpression(IConfigurationProvider configurationProvider, ProfileMap profileMap,
                                            IMemberMap memberMap,
                                            Expression sourceExpression, Expression destExpression, Expression contextExpression)
            {
                Expression <Func <DestinationType> > expr = () => new DestinationType();

                return(expr.Body);
            }
Example #17
0
 public Expression MapExpression(IConfigurationProvider configurationProvider, ProfileMap profileMap,
                                 IMemberMap memberMap, Expression sourceExpression, Expression destExpression,
                                 Expression contextExpression) =>
 Call(null,
      MapMethodInfo.MakeGenericMethod(destExpression.Type, sourceExpression.Type,
                                      ElementTypeHelper.GetElementType(sourceExpression.Type)),
      sourceExpression,
      contextExpression);
Example #18
0
 public Expression MapExpression(IConfigurationProvider configurationProvider, ProfileMap profileMap,
                                 IMemberMap memberMap, Expression sourceExpression, Expression destExpression,
                                 Expression contextExpression) =>
 ExpressionFactory.ToType(
     Expression.Call(ChangeTypeMethod, ExpressionFactory.ToObject(sourceExpression),
                     Expression.Constant(destExpression.Type)),
     destExpression.Type
     );
Example #19
0
 void IElementContentContainer <T> .SetElementContentMap(IMemberMap <T> map)
 {
     if (_contentMap != null)
     {
         throw new MappingException("Element content is mapped more than once in {0}.", this.GetType().Name);
     }
     _contentMap = map;
 }
Example #20
0
 public Column(string columnNameAlias, IMemberMap property, IClassMapper classMapper, Table table)
 {
     Alias         = columnNameAlias;
     ClassMapper   = classMapper;
     Property      = property;
     TableIdentity = table.Identity;
     Table         = table;
 }
        public Func <TSource, TDestination, ResolutionContext, TDestination> GetMapperFunc <TSource, TDestination>(
            TypePair types, IMemberMap memberMap = null)
        {
            var key        = new TypePair(typeof(TSource), typeof(TDestination));
            var mapRequest = new MapRequest(key, types, memberMap);

            return(GetMapperFunc <TSource, TDestination>(mapRequest));
        }
Example #22
0
 public Expression MapExpression(IConfigurationProvider configurationProvider, ProfileMap profileMap,
                                 IMemberMap memberMap, Expression sourceExpression, Expression destExpression,
                                 Expression contextExpression) =>
 ToType(
     Call(EnumToObject, Constant(destExpression.Type),
          ToObject(sourceExpression)),
     destExpression.Type
     );
        public Expression MapExpression(IConfigurationProvider configurationProvider, ProfileMap profileMap,
                                        IMemberMap memberMap, Expression sourceExpression, Expression destExpression, Expression contextExpression)
        {
            var listType = typeof(List <>).MakeGenericType(ElementTypeHelper.GetElementType(destExpression.Type));
            var list     = MapCollectionExpression(configurationProvider, profileMap, memberMap, sourceExpression, Default(listType), contextExpression, typeof(List <>), MapItemExpr);
            var dest     = Variable(listType, "dest");

            return(Block(new[] { dest }, Assign(dest, list), Condition(NotEqual(dest, Default(listType)), New(destExpression.Type.GetDeclaredConstructors().First(), dest), Default(destExpression.Type))));
        }
Example #24
0
        public object Map(object source, object destination, Type sourceType, Type destinationType,
                          ResolutionContext context, IMemberMap memberMap)
        {
            var types = TypePair.Create(source, destination, sourceType, destinationType);

            var func = ConfigurationProvider.GetUntypedMapperFunc(new MapRequest(new TypePair(sourceType, destinationType), types, memberMap));

            return(func(source, destination, context));
        }
Example #25
0
        public TDestination Map <TSource, TDestination>(TSource source, TDestination destination,
                                                        ResolutionContext context, IMemberMap memberMap)
        {
            var types = TypePair.Create(source, destination, typeof(TSource), typeof(TDestination));

            var func = ConfigurationProvider.GetMapperFunc <TSource, TDestination>(types, memberMap);

            return(func(source, destination, context));
        }
 public Expression MapExpression(IConfigurationProvider configurationProvider, ProfileMap profileMap,
                                 IMemberMap memberMap, Expression sourceExpression, Expression destExpression,
                                 Expression contextExpression) =>
 ExpressionBuilder.MapExpression(configurationProvider, profileMap,
                                 new TypePair(sourceExpression.Type, Nullable.GetUnderlyingType(destExpression.Type)),
                                 sourceExpression,
                                 contextExpression,
                                 memberMap
                                 );
 public Expression MapExpression(IConfigurationProvider configurationProvider, ProfileMap profileMap,
                                 IMemberMap memberMap, Expression sourceExpression, Expression destExpression,
                                 Expression contextExpression) =>
 ExpressionBuilder.MapExpression(configurationProvider, profileMap,
                                 new TypePair(Nullable.GetUnderlyingType(sourceExpression.Type), destExpression.Type),
                                 Property(sourceExpression, sourceExpression.Type.GetDeclaredProperty("Value")),
                                 contextExpression,
                                 memberMap,
                                 destExpression
                                 );
Example #28
0
 public static Expression CheckCustomSource(this IMemberMap memberMap, ExpressionResolutionResult expressionResolutionResult, LetPropertyMaps letPropertyMaps)
 {
     if (memberMap.CustomSource == null)
     {
         return(expressionResolutionResult.ResolutionExpression);
     }
     return(memberMap.CustomSource.IsMemberPath() ?
            memberMap.CustomSource.ReplaceParameters(expressionResolutionResult.ResolutionExpression) :
            letPropertyMaps.GetSubQueryMarker(memberMap.CustomSource));
 }
Example #29
0
        public virtual string GetColumnName(IClassMapper map, string propertyName, bool includeAlias)
        {
            IMemberMap propertyMap = map.Properties.SingleOrDefault(p => p.Name.Equals(propertyName, StringComparison.InvariantCultureIgnoreCase));

            if (propertyMap == null)
            {
                throw new ArgumentException(string.Format("Could not find '{0}' in Mapping.", propertyName));
            }

            return(GetColumnName(map, propertyMap, includeAlias));
        }
Example #30
0
        public virtual string GetColumnName(IClassMapper map, IMemberMap property, bool includeAlias)
        {
            string alias = null;

            if (property.ColumnName != property.Name && includeAlias)
            {
                alias = property.Name;
            }

            return(Configuration.Dialect.GetColumnName(GetTableName(map), property.ColumnName, alias));
        }
 public Expression MapExpression(IConfigurationProvider configurationProvider, ProfileMap profileMap,
                                 IMemberMap memberMap, Expression sourceExpression, Expression destExpression,
                                 Expression contextExpression) =>
 ExpressionFactory.ToType(
     Expression.Call(EnumParseMethod,
                     Expression.Constant(destExpression.Type),
                     Expression.Call(sourceExpression, sourceExpression.Type.GetDeclaredMethod("ToString", new Type[0])),
                     Expression.Constant(true)
                     ),
     destExpression.Type
     );