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