Ejemplo n.º 1
0
 private static Expression DefaultDestination(Type destinationType, Type declaredDestinationType, ProfileMap profileMap)
 {
     if (profileMap.AllowNullCollections || destinationType == typeof(string) || !destinationType.IsEnumerableType())
     {
         return(Default(declaredDestinationType));
     }
     if (destinationType.IsArray)
     {
         var destinationElementType = destinationType.GetElementType();
         return(NewArrayBounds(destinationElementType, Enumerable.Repeat(Constant(0), destinationType.GetArrayRank())));
     }
     return(DelegateFactory.GenerateNonNullConstructorExpression(destinationType));
 }
Ejemplo n.º 2
0
        private static Expression DefaultDestination(Type destinationType, Type declaredDestinationType, ProfileMap profileMap)
        {
            var isCollection = destinationType.IsNonStringEnumerable();

            if ((isCollection && profileMap.AllowNullCollections) || (!isCollection && profileMap.AllowNullDestinationValues))
            {
                return(Default(declaredDestinationType));
            }
            if (destinationType.IsArray)
            {
                var destinationElementType = destinationType.GetElementType();
                return(NewArrayBounds(destinationElementType, Enumerable.Repeat(Constant(0), destinationType.GetArrayRank())));
            }
            return(DelegateFactory.GenerateNonNullConstructorExpression(destinationType));
        }
Ejemplo n.º 3
0
        private static Expression DefaultDestination(Type destinationType, ProfileMap profileMap)
        {
            var defaultValue = Default(destinationType);

            if (profileMap.AllowNullCollections || destinationType == typeof(string) ||
                !destinationType.IsEnumerableType())
            {
                return(defaultValue);
            }
            if (destinationType.IsArray)
            {
                var destinationElementType = destinationType.GetElementType();
                return(NewArrayBounds(destinationElementType,
                                      Enumerable.Repeat(Constant(0), destinationType.GetArrayRank())));
            }
            if (destinationType.IsDictionaryType())
            {
                return(CreateCollection(typeof(Dictionary <,>)));
            }
            if (destinationType.IsSetType())
            {
                return(CreateCollection(typeof(HashSet <>)));
            }
            return(CreateCollection(typeof(List <>)));

            Expression CreateCollection(Type collectionType)
            {
                Type concreteDestinationType;

                if (destinationType.IsInterface())
                {
                    var genericArguments = destinationType.GetGenericArguments();
                    if (genericArguments.Length == 0)
                    {
                        genericArguments = new[] { typeof(object) }
                    }
                    ;
                    concreteDestinationType = collectionType.MakeGenericType(genericArguments);
                }
                else
                {
                    concreteDestinationType = destinationType;
                }
                var constructor = DelegateFactory.GenerateNonNullConstructorExpression(concreteDestinationType);

                return(ExpressionFactory.ToType(constructor, destinationType));
            }
        }
Ejemplo n.º 4
0
        private Expression BuildValueResolverFunc(PropertyMap propertyMap, Expression destValueExpr)
        {
            Expression valueResolverFunc;
            var        destinationPropertyType = propertyMap.DestinationPropertyType;
            var        valueResolverConfig     = propertyMap.ValueResolverConfig;
            var        typeMap = propertyMap.TypeMap;

            if (valueResolverConfig != null)
            {
                valueResolverFunc = ToType(BuildResolveCall(destValueExpr, valueResolverConfig), destinationPropertyType);
            }
            else if (propertyMap.CustomResolver != null)
            {
                valueResolverFunc = propertyMap.CustomResolver.ConvertReplaceParameters(_source, _destination, destValueExpr, _context);
            }
            else if (propertyMap.CustomExpression != null)
            {
                var nullCheckedExpression = propertyMap.CustomExpression.ReplaceParameters(_source).IfNotNull(destinationPropertyType);
                var destinationNullable   = destinationPropertyType.IsNullableType();
                var returnType            = destinationNullable && destinationPropertyType.GetTypeOfNullable() == nullCheckedExpression.Type
                    ? destinationPropertyType
                    : nullCheckedExpression.Type;
                valueResolverFunc =
                    TryCatch(
                        ToType(nullCheckedExpression, returnType),
                        Catch(typeof(NullReferenceException), Default(returnType)),
                        Catch(typeof(ArgumentNullException), Default(returnType))
                        );
            }
            else if (propertyMap.SourceMembers.Any() &&
                     propertyMap.SourceType != null
                     )
            {
                var last = propertyMap.SourceMembers.Last();
                var pi   = last as PropertyInfo;
                if (pi != null && pi.GetGetMethod(true) == null)
                {
                    valueResolverFunc = Default(last.GetMemberType());
                }
                else
                {
                    valueResolverFunc = propertyMap.SourceMembers.Aggregate(
                        (Expression)_source,
                        (inner, getter) => getter is MethodInfo
                            ? getter.IsStatic()
                                ? Call(null, (MethodInfo)getter, inner)
                                : (Expression)Call(inner, (MethodInfo)getter)
                            : MakeMemberAccess(getter.IsStatic() ? null : inner, getter)
                        );
                    valueResolverFunc = valueResolverFunc.IfNotNull(destinationPropertyType);
                }
            }
            else if (propertyMap.SourceMember != null)
            {
                valueResolverFunc = MakeMemberAccess(_source, propertyMap.SourceMember);
            }
            else
            {
                valueResolverFunc = Throw(Constant(new Exception("I done blowed up")));
            }

            if (propertyMap.NullSubstitute != null)
            {
                var nullSubstitute = Constant(propertyMap.NullSubstitute);
                valueResolverFunc = Coalesce(valueResolverFunc, ToType(nullSubstitute, valueResolverFunc.Type));
            }
            else if (!typeMap.Profile.AllowNullDestinationValues)
            {
                var toCreate = propertyMap.SourceType ?? destinationPropertyType;
                if (!toCreate.IsAbstract() && toCreate.IsClass())
                {
                    valueResolverFunc = Coalesce(
                        valueResolverFunc,
                        ToType(DelegateFactory.GenerateNonNullConstructorExpression(toCreate), propertyMap.SourceType)
                        );
                }
            }

            return(valueResolverFunc);
        }