private static MemberAssignment BindNullableExpression(PropertyMap propertyMap, ExpressionResolutionResult result) { if (result.ResolutionExpression.NodeType == ExpressionType.MemberAccess) { var memberExpr = (MemberExpression) result.ResolutionExpression; if (memberExpr.Expression != null && memberExpr.Expression.NodeType == ExpressionType.MemberAccess) { var destType = propertyMap.DestinationPropertyType; var parentExpr = memberExpr.Expression; Expression expressionToBind = Expression.Convert(memberExpr, destType); var nullExpression = Expression.Convert(Expression.Constant(null), destType); while (parentExpr.NodeType != ExpressionType.Parameter) { memberExpr = (MemberExpression) memberExpr.Expression; parentExpr = memberExpr.Expression; expressionToBind = Expression.Condition( Expression.Equal(memberExpr, Expression.Constant(null)), nullExpression, expressionToBind ); } return Expression.Bind(propertyMap.DestinationProperty.MemberInfo, expressionToBind); } } return Expression.Bind(propertyMap.DestinationProperty.MemberInfo, Expression.Convert(result.ResolutionExpression, propertyMap.DestinationPropertyType)); }
private static MemberAssignment BindEnumerableExpression(IConfigurationProvider configuration, PropertyMap propertyMap, ExpressionRequest request, ExpressionResolutionResult result, ConcurrentDictionary<ExpressionRequest, int> typePairCount) { var destinationListType = TypeHelper.GetElementType(propertyMap.DestinationPropertyType); var sourceListType = TypeHelper.GetElementType(propertyMap.SourceType); var expression = result.ResolutionExpression; if (sourceListType != destinationListType) { var listTypePair = new ExpressionRequest(sourceListType, destinationListType, request.MembersToExpand); var transformedExpression = configuration.ExpressionBuilder.CreateMapExpression(listTypePair, typePairCount); if(transformedExpression == null) { return null; } expression = Expression.Call(typeof (Enumerable), "Select", new[] {sourceListType, destinationListType}, result.ResolutionExpression, transformedExpression); } expression = Expression.Call(typeof(Enumerable), propertyMap.DestinationPropertyType.IsArray ? "ToArray" : "ToList", new[] { destinationListType }, expression); if(configuration.Configuration.AllowNullCollections) { expression = Expression.Condition( Expression.NotEqual( Expression.TypeAs(result.ResolutionExpression, typeof(object)), Expression.Constant(null)), expression, Expression.Constant(null, propertyMap.DestinationPropertyType)); } return Expression.Bind(propertyMap.DestinationProperty, expression); }
private static MemberAssignment BindEnumerableExpression(IMappingEngine mappingEngine, PropertyMap propertyMap, ExpressionRequest request, ExpressionResolutionResult result, Internal.IDictionary<ExpressionRequest, int> typePairCount) { MemberAssignment bindExpression; Type destinationListType = GetDestinationListTypeFor(propertyMap); Type sourceListType = null; // is list if (result.Type.IsArray) { sourceListType = result.Type.GetElementType(); } else { sourceListType = result.Type.GetGenericArguments().First(); } var listTypePair = new ExpressionRequest(sourceListType, destinationListType, request.IncludedMembers); var selectExpression = result.ResolutionExpression; if (sourceListType != destinationListType) { var transformedExpression = Extensions.CreateMapExpression(mappingEngine, listTypePair, typePairCount); selectExpression = Expression.Call( typeof (Enumerable), "Select", new[] {sourceListType, destinationListType}, result.ResolutionExpression, transformedExpression); } if (typeof (IList<>).MakeGenericType(destinationListType) .IsAssignableFrom(propertyMap.DestinationPropertyType) || typeof (ICollection<>).MakeGenericType(destinationListType) .IsAssignableFrom(propertyMap.DestinationPropertyType)) { // Call .ToList() on IEnumerable var toListCallExpression = GetToListCallExpression(propertyMap, destinationListType, selectExpression); bindExpression = Expression.Bind(propertyMap.DestinationProperty.MemberInfo, toListCallExpression); } else if (propertyMap.DestinationPropertyType.IsArray) { // Call .ToArray() on IEnumerable MethodCallExpression toArrayCallExpression = Expression.Call( typeof (Enumerable), "ToArray", new[] {destinationListType}, selectExpression); bindExpression = Expression.Bind(propertyMap.DestinationProperty.MemberInfo, toArrayCallExpression); } else { // destination type implements ienumerable, but is not an ilist. allow deferred enumeration bindExpression = Expression.Bind(propertyMap.DestinationProperty.MemberInfo, selectExpression); } return bindExpression; }
private static ExpressionResolutionResult ExpressionResolutionResult( ExpressionResolutionResult expressionResolutionResult, LambdaExpression lambdaExpression) { Expression currentChild = lambdaExpression.ReplaceParameters(expressionResolutionResult.ResolutionExpression); Type currentChildType = currentChild.Type; return new ExpressionResolutionResult(currentChild, currentChildType); }
private static MemberAssignment BindCustomProjectionExpression(PropertyMap propertyMap, TypeMap propertyTypeMap, ExpressionResolutionResult result) { var visitor = new ParameterReplacementVisitor(result.ResolutionExpression); var replaced = visitor.Visit(propertyTypeMap.CustomProjection.Body); return Expression.Bind(propertyMap.DestinationProperty.MemberInfo, replaced); }
private static MemberAssignment BindEnumerableExpression(IConfigurationProvider configuration, PropertyMap propertyMap, ExpressionRequest request, ExpressionResolutionResult result, ConcurrentDictionary<ExpressionRequest, int> typePairCount) { var destinationListType = GetDestinationListTypeFor(propertyMap); var sourceListType = result.Type.IsArray ? result.Type.GetElementType() : result.Type.GetTypeInfo().GenericTypeArguments.First(); var listTypePair = new ExpressionRequest(sourceListType, destinationListType, request.MembersToExpand); Expression exp = result.ResolutionExpression; if (sourceListType != destinationListType) { var transformedExpression = configuration.ExpressionBuilder.CreateMapExpression(listTypePair, typePairCount); if(transformedExpression == null) { return null; } exp = Expression.Call( typeof (Enumerable), "Select", new[] {sourceListType, destinationListType}, result.ResolutionExpression, transformedExpression); } if (typeof (IList<>).MakeGenericType(destinationListType) .GetTypeInfo().IsAssignableFrom(propertyMap.DestinationPropertyType.GetTypeInfo()) || typeof (ICollection<>).MakeGenericType(destinationListType) .GetTypeInfo().IsAssignableFrom(propertyMap.DestinationPropertyType.GetTypeInfo())) { // Call .ToList() on IEnumerable exp = GetToListCallExpression(propertyMap, destinationListType, exp); } else if (propertyMap.DestinationPropertyType.IsArray) { // Call .ToArray() on IEnumerable exp = Expression.Call( typeof (Enumerable), "ToArray", new[] {destinationListType}, exp); } if(configuration.AllowNullCollections) { exp = Expression.Condition( Expression.NotEqual( Expression.TypeAs(result.ResolutionExpression, typeof(object)), Expression.Constant(null)), exp, Expression.Constant(null, propertyMap.DestinationPropertyType)); } return Expression.Bind(propertyMap.DestinationProperty.MemberInfo, exp); }
public ExpressionResolutionResult GetExpressionResolutionResult( ExpressionResolutionResult expressionResolutionResult, PropertyMap propertyMap, LetPropertyMaps letPropertyMaps) { Expression subQueryMarker; if ((subQueryMarker = letPropertyMaps.GetSubQueryMarker()) != null) { return(new ExpressionResolutionResult(subQueryMarker, subQueryMarker.Type)); } return(ExpressionResolutionResult(expressionResolutionResult, propertyMap.CustomExpression)); }
public ExpressionResolutionResult GetExpressionResolutionResult( ExpressionResolutionResult expressionResolutionResult, PropertyMap propertyMap, IValueResolver valueResolver) { var oldParameter = propertyMap.CustomExpression.Parameters.Single(); var newParameter = expressionResolutionResult.ResolutionExpression; var converter = new ParameterConversionVisitor(newParameter, oldParameter); Expression currentChild = converter.Visit(propertyMap.CustomExpression.Body); Type currentChildType = currentChild.Type; return(new ExpressionResolutionResult(currentChild, currentChildType)); }
public static Expression CheckCustomSource(this IMemberMap memberMap, ExpressionResolutionResult expressionResolutionResult, LetPropertyMaps letPropertyMaps) { var customSource = memberMap.ProjectToCustomSource; if (customSource == null) { return(expressionResolutionResult.ResolutionExpression); } return(customSource.IsMemberPath() ? customSource.ReplaceParameters(expressionResolutionResult.ResolutionExpression) : letPropertyMaps.GetSubQueryMarker(customSource)); }
private static ExpressionResolutionResult ExpressionResolutionResult( ExpressionResolutionResult expressionResolutionResult, LambdaExpression lambdaExpression) { var oldParameter = lambdaExpression.Parameters.Single(); var newParameter = expressionResolutionResult.ResolutionExpression; var converter = new ParameterConversionVisitor(newParameter, oldParameter); Expression currentChild = converter.Visit(lambdaExpression.Body); Type currentChildType = currentChild.Type; return new ExpressionResolutionResult(currentChild, currentChildType); }
private static ExpressionResolutionResult ExpressionResolutionResult( ExpressionResolutionResult expressionResolutionResult, LambdaExpression lambdaExpression) { var oldParameter = lambdaExpression.Parameters.Single(); var newParameter = expressionResolutionResult.ResolutionExpression; var converter = new ParameterConversionVisitor(newParameter, oldParameter); Expression currentChild = converter.Visit(lambdaExpression.Body); Type currentChildType = currentChild.Type; return(new ExpressionResolutionResult(currentChild, currentChildType)); }
private static MemberAssignment BindEnumerableExpression(IConfigurationProvider configuration, PropertyMap propertyMap, ExpressionRequest request, ExpressionResolutionResult result, ConcurrentDictionary<ExpressionRequest, int> typePairCount) { MemberAssignment bindExpression; Type destinationListType = GetDestinationListTypeFor(propertyMap); var sourceListType = result.Type.IsArray ? result.Type.GetElementType() : result.Type.GetTypeInfo().GenericTypeArguments.First(); var listTypePair = new ExpressionRequest(sourceListType, destinationListType, request.MembersToExpand); var selectExpression = result.ResolutionExpression; if (sourceListType != destinationListType) { var transformedExpression = configuration.ExpressionBuilder.CreateMapExpression(listTypePair, typePairCount); if(transformedExpression == null) { return null; } selectExpression = Expression.Call( typeof (Enumerable), "Select", new[] {sourceListType, destinationListType}, result.ResolutionExpression, transformedExpression); } if (typeof (IList<>).MakeGenericType(destinationListType) .GetTypeInfo().IsAssignableFrom(propertyMap.DestinationPropertyType.GetTypeInfo()) || typeof (ICollection<>).MakeGenericType(destinationListType) .GetTypeInfo().IsAssignableFrom(propertyMap.DestinationPropertyType.GetTypeInfo())) { // Call .ToList() on IEnumerable var toListCallExpression = GetToListCallExpression(propertyMap, destinationListType, selectExpression); bindExpression = Expression.Bind(propertyMap.DestinationProperty.MemberInfo, toListCallExpression); } else if (propertyMap.DestinationPropertyType.IsArray) { // Call .ToArray() on IEnumerable MethodCallExpression toArrayCallExpression = Expression.Call( typeof (Enumerable), "ToArray", new[] {destinationListType}, selectExpression); bindExpression = Expression.Bind(propertyMap.DestinationProperty.MemberInfo, toArrayCallExpression); } else { // destination type implements ienumerable, but is not an ilist. allow deferred enumeration bindExpression = Expression.Bind(propertyMap.DestinationProperty.MemberInfo, selectExpression); } return bindExpression; }
public ExpressionResolutionResult GetExpressionResolutionResult(ExpressionResolutionResult expressionResolutionResult, PropertyMap propertyMap, IValueResolver valueResolver) { Expression currentChild = expressionResolutionResult.ResolutionExpression; Type currentChildType = expressionResolutionResult.Type; var nullSubstitute = propertyMap.NullSubstitute; var newParameter = expressionResolutionResult.ResolutionExpression; var converter = new NullSubstitutionConversionVisitor(newParameter, nullSubstitute); currentChild = converter.Visit(currentChild); currentChildType = currentChildType.GetTypeOfNullable(); return(new ExpressionResolutionResult(currentChild, currentChildType)); }
public ExpressionResolutionResult GetExpressionResolutionResult( ExpressionResolutionResult expressionResolutionResult, IMemberMap propertyMap, LetPropertyMaps letPropertyMaps) { Expression subQueryMarker; if ((subQueryMarker = letPropertyMaps.GetSubQueryMarker()) != null) { return(new ExpressionResolutionResult(subQueryMarker, subQueryMarker.Type)); } var currentChild = propertyMap.CustomMapExpression.ReplaceParameters(expressionResolutionResult.ResolutionExpression); var currentChildType = currentChild.Type; return(new ExpressionResolutionResult(currentChild, currentChildType)); }
public Expression NewExpression(Expression instanceParameter) { var parameters = CtorParams.Select(map => { var result = new ExpressionResolutionResult(instanceParameter, Ctor.DeclaringType); var matchingExpressionConverter = ExpressionResultConverters.FirstOrDefault(c => c.CanGetExpressionResolutionResult(result, map)); result = matchingExpressionConverter?.GetExpressionResolutionResult(result, map) ?? throw new AutoMapperMappingException($"Unable to generate the instantiation expression for the constructor {Ctor}: no expression could be mapped for constructor parameter '{map.Parameter}'.", null, TypeMap.Types); return(result); }); return(New(Ctor, parameters.Select(p => p.ResolutionExpression))); }
private static ExpressionResolutionResult ResolveExpression(PropertyMap propertyMap, Type currentType, Expression instanceParameter) { var result = new ExpressionResolutionResult(instanceParameter, currentType); foreach (var resolver in propertyMap.GetSourceValueResolvers()) { var matchingExpressionConverter = ExpressionResultConverters.FirstOrDefault(c => c.CanGetExpressionResolutionResult(result, resolver)); if (matchingExpressionConverter == null) { throw new Exception("Can't resolve this to Queryable Expression"); } result = matchingExpressionConverter.GetExpressionResolutionResult(result, propertyMap, resolver); } return(result); }
private static MemberAssignment BindMappedTypeExpression(IMappingEngine mappingEngine, PropertyMap propertyMap, ExpressionRequest request, ExpressionResolutionResult result, Internal.IDictionary<ExpressionRequest, int> typePairCount) { var transformedExpression = ((IMappingEngineRunner)mappingEngine).CreateMapExpression(request, result.ResolutionExpression, typePairCount); // Handles null source property so it will not create an object with possible non-nullable propeerties // which would result in an exception. if (mappingEngine.ConfigurationProvider.MapNullSourceValuesAsNull) { var expressionNull = Expression.Constant(null, propertyMap.DestinationPropertyType); transformedExpression = Expression.Condition(Expression.NotEqual(result.ResolutionExpression, Expression.Constant(null)), transformedExpression, expressionNull); } return Expression.Bind(propertyMap.DestinationProperty.MemberInfo, transformedExpression); }
private static ExpressionResolutionResult ExpressionResolutionResult( ExpressionResolutionResult expressionResolutionResult, MemberInfo getter) { Expression currentChild = expressionResolutionResult.ResolutionExpression; Type currentChildType; var propertyInfo = getter as PropertyInfo; if (propertyInfo != null) { currentChild = Expression.Property(currentChild, propertyInfo); currentChildType = propertyInfo.PropertyType; } else currentChildType = currentChild.Type; return new ExpressionResolutionResult(currentChild, currentChildType); }
public ExpressionResolutionResult GetExpressionResolutionResult(ExpressionResolutionResult expressionResolutionResult, PropertyMap propertyMap, IValueResolver valueResolver) { Expression currentChild = expressionResolutionResult.ResolutionExpression; Type currentChildType; var getter = (IMemberGetter)valueResolver; var memberInfo = getter.MemberInfo; var propertyInfo = memberInfo as PropertyInfo; if (propertyInfo != null) { currentChild = Expression.Property(currentChild, propertyInfo); currentChildType = propertyInfo.PropertyType; } else currentChildType = currentChild.Type; return new ExpressionResolutionResult(currentChild, currentChildType); }
private static MemberAssignment BindMappedTypeExpression(IConfigurationProvider configuration, PropertyMap propertyMap, ExpressionRequest request, ExpressionResolutionResult result, IDictionary<ExpressionRequest, int> typePairCount) { var transformedExpression = configuration.ExpressionBuilder.CreateMapExpression(request, result.ResolutionExpression, typePairCount); if(transformedExpression == null) { return null; } // Handles null source property so it will not create an object with possible non-nullable propeerties // which would result in an exception. if (propertyMap.TypeMap.Profile.AllowNullDestinationValues && !propertyMap.AllowNull) { var expressionNull = Expression.Constant(null, propertyMap.DestinationPropertyType); transformedExpression = Expression.Condition(Expression.NotEqual(result.ResolutionExpression, Expression.Constant(null)), transformedExpression, expressionNull); } return Expression.Bind(propertyMap.DestinationProperty, transformedExpression); }
private static ExpressionResolutionResult ExpressionResolutionResult( ExpressionResolutionResult expressionResolutionResult, MemberInfo getter) { Expression currentChild = expressionResolutionResult.ResolutionExpression; Type currentChildType; var propertyInfo = getter as PropertyInfo; if (propertyInfo != null) { currentChild = Expression.Property(currentChild, propertyInfo); currentChildType = propertyInfo.PropertyType; } else { currentChildType = currentChild.Type; } return(new ExpressionResolutionResult(currentChild, currentChildType)); }
public ExpressionResolutionResult GetExpressionResolutionResult(ExpressionResolutionResult expressionResolutionResult, PropertyMap propertyMap, IValueResolver valueResolver) { Expression currentChild = expressionResolutionResult.ResolutionExpression; Type currentChildType; var getter = (IMemberGetter)valueResolver; var memberInfo = getter.MemberInfo; var propertyInfo = memberInfo as PropertyInfo; if (propertyInfo != null) { currentChild = Expression.Property(currentChild, propertyInfo); currentChildType = propertyInfo.PropertyType; } else { currentChildType = currentChild.Type; } return(new ExpressionResolutionResult(currentChild, currentChildType)); }
public Expression NewExpression(Expression instanceParameter) { var parameters = CtorParams.Select(map => { var result = new ExpressionResolutionResult(instanceParameter, Ctor.DeclaringType); var matchingExpressionConverter = ExpressionResultConverters.FirstOrDefault(c => c.CanGetExpressionResolutionResult(result, map)); if (matchingExpressionConverter == null) { throw new Exception("Can't resolve this to Queryable Expression"); } result = matchingExpressionConverter.GetExpressionResolutionResult(result, map); return(result); }); return(Expression.New(Ctor, parameters.Select(p => p.ResolutionExpression))); }
public ExpressionResolutionResult GetExpressionResolutionResult( ExpressionResolutionResult expressionResolutionResult, PropertyMap propertyMap) { return ExpressionResolutionResult(expressionResolutionResult, propertyMap.CustomExpression); }
private static MemberAssignment BindAssignableExpression(PropertyMap propertyMap, ExpressionResolutionResult result) { return Expression.Bind(propertyMap.DestinationProperty.MemberInfo, result.ResolutionExpression); }
public MemberAssignment Build(IConfigurationProvider configuration, PropertyMap propertyMap, TypeMap propertyTypeMap, ExpressionRequest request, ExpressionResolutionResult result, IDictionary<ExpressionRequest, int> typePairCount) { return BindMappedTypeExpression(configuration, propertyMap, request, result, typePairCount); }
public bool CanGetExpressionResolutionResult(ExpressionResolutionResult expressionResolutionResult, IValueResolver valueResolver) { return valueResolver is IMemberGetter; }
private static MemberAssignment BindCustomProjectionExpression(PropertyMap propertyMap, TypeMap propertyTypeMap, ExpressionResolutionResult result) { return Expression.Bind(propertyMap.DestinationProperty, propertyTypeMap.CustomProjection.ConvertReplaceParameters(result.ResolutionExpression)); }
public bool IsMatch(PropertyMap propertyMap, TypeMap propertyTypeMap, ExpressionResolutionResult result) { return propertyMap.DestinationPropertyType.IsNullableType() && !result.Type.IsNullableType(); }
public bool IsMatch(PropertyMap propertyMap, TypeMap propertyTypeMap, ExpressionResolutionResult result) { return propertyMap.DestinationPropertyType.GetInterfaces().Any(t => t.Name == "IEnumerable") && propertyMap.DestinationPropertyType != typeof (string); }
public bool IsMatch(PropertyMap propertyMap, TypeMap propertyTypeMap, ExpressionResolutionResult result) { return PrimitiveExtensions.IsNullableType(propertyMap.DestinationPropertyType) && !PrimitiveExtensions.IsNullableType(result.Type); }
public MemberAssignment Build(IMappingEngine mappingEngine, PropertyMap propertyMap, TypeMap propertyTypeMap, ExpressionRequest request, ExpressionResolutionResult result, IDictionary<ExpressionRequest, int> typePairCount) { return BindNullableExpression(propertyMap, result); }
public ExpressionResolutionResult GetExpressionResolutionResult(ExpressionResolutionResult expressionResolutionResult, PropertyMap propertyMap, LetPropertyMaps letPropertyMaps) => ExpressionResolutionResult(expressionResolutionResult, propertyMap.SourceMembers);
public bool IsMatch(PropertyMap propertyMap, TypeMap propertyTypeMap, ExpressionResolutionResult result) { return(propertyTypeMap?.CustomProjection != null); }
private static MemberAssignment BindCustomProjectionExpression(PropertyMap propertyMap, TypeMap propertyTypeMap, ExpressionResolutionResult result) { return(Expression.Bind(propertyMap.DestinationProperty, propertyTypeMap.CustomProjection.ConvertReplaceParameters(result.ResolutionExpression))); }
public MemberAssignment Build(IMappingEngine mappingEngine, PropertyMap propertyMap, TypeMap propertyTypeMap, ExpressionRequest request, ExpressionResolutionResult result, Internal.IDictionary<ExpressionRequest, int> typePairCount) { return BindMappedTypeExpression(mappingEngine, propertyMap, request, result, typePairCount); }
public bool IsMatch(PropertyMap propertyMap, TypeMap propertyTypeMap, ExpressionResolutionResult result) { return propertyTypeMap != null && propertyTypeMap.CustomProjection == null; }
public bool CanGetExpressionResolutionResult(ExpressionResolutionResult expressionResolutionResult, IValueResolver valueResolver) { return valueResolver is NullReplacementMethod && expressionResolutionResult.Type.IsNullableType(); }
public bool CanGetExpressionResolutionResult(ExpressionResolutionResult expressionResolutionResult, IMemberMap propertyMap) => propertyMap.SourceMembers.Count > 0;
public bool IsMatch(PropertyMap propertyMap, TypeMap propertyTypeMap, ExpressionResolutionResult result) { return propertyMap.DestinationPropertyType.IsAssignableFrom(result.Type); }
public ExpressionResolutionResult GetExpressionResolutionResult(ExpressionResolutionResult expressionResolutionResult, ConstructorParameterMap propertyMap) => ExpressionResolutionResult(expressionResolutionResult, propertyMap.SourceMembers);
private static MemberAssignment BindMappedTypeExpression(IConfigurationProvider configuration, PropertyMap propertyMap, ExpressionRequest request, ExpressionResolutionResult result, IDictionary <ExpressionRequest, int> typePairCount, LetPropertyMaps letPropertyMaps) { var transformedExpression = configuration.ExpressionBuilder.CreateMapExpression(request, result.ResolutionExpression, typePairCount, letPropertyMaps); if (transformedExpression == null) { return(null); } // Handles null source property so it will not create an object with possible non-nullable properties // which would result in an exception. if (propertyMap.TypeMap.Profile.AllowNullDestinationValues && !propertyMap.AllowNull && !(result.ResolutionExpression is ParameterExpression)) { transformedExpression = result.ResolutionExpression.IfNullElse(Constant(null, transformedExpression.Type), transformedExpression); } return(Bind(propertyMap.DestinationProperty, transformedExpression)); }
public bool IsMatch(PropertyMap propertyMap, TypeMap propertyTypeMap, ExpressionResolutionResult result) => propertyTypeMap != null && propertyTypeMap.CustomProjection == null;
private static MemberAssignment BindMappedTypeExpression(IConfigurationProvider configuration, PropertyMap propertyMap, ExpressionRequest request, ExpressionResolutionResult result, ConcurrentDictionary <ExpressionRequest, int> typePairCount) { var transformedExpression = configuration.ExpressionBuilder.CreateMapExpression(request, result.ResolutionExpression, typePairCount); if (transformedExpression == null) { return(null); } // Handles null source property so it will not create an object with possible non-nullable propeerties // which would result in an exception. if (configuration.Configuration.AllowNullDestinationValues && !propertyMap.AllowNull) { var expressionNull = Expression.Constant(null, propertyMap.DestType); transformedExpression = Expression.Condition(Expression.NotEqual(result.ResolutionExpression, Expression.Constant(null)), transformedExpression, expressionNull); } return(Expression.Bind(propertyMap.DestMember, transformedExpression)); }
public MemberAssignment Build(IConfigurationProvider configuration, PropertyMap propertyMap, TypeMap propertyTypeMap, ExpressionRequest request, ExpressionResolutionResult result, IDictionary <ExpressionRequest, int> typePairCount, LetPropertyMaps letPropertyMaps) => BindMappedTypeExpression(configuration, propertyMap, request, result, typePairCount, letPropertyMaps);
public bool CanGetExpressionResolutionResult(ExpressionResolutionResult expressionResolutionResult, ConstructorParameterMap propertyMap) => propertyMap.SourceMembers.Any();
public bool IsMatch(PropertyMap propertyMap, TypeMap propertyTypeMap, ExpressionResolutionResult result) { return(propertyMap.DestinationPropertyType.GetTypeInfo().ImplementedInterfaces.Any(t => t.Name == "IEnumerable") && propertyMap.DestinationPropertyType != typeof(string)); }
public ExpressionResolutionResult GetExpressionResolutionResult(ExpressionResolutionResult expressionResolutionResult, IMemberMap propertyMap, LetPropertyMaps letPropertyMaps) => new ExpressionResolutionResult(propertyMap.SourceMembers.MemberAccesses(propertyMap.CheckCustomSource(expressionResolutionResult, letPropertyMaps)));
private static MemberAssignment BindStringExpression(PropertyMap propertyMap, ExpressionResolutionResult result) { return(Expression.Bind(propertyMap.DestinationProperty, Expression.Call(result.ResolutionExpression, "ToString", null, null))); }
public bool IsMatch(PropertyMap propertyMap, TypeMap propertyTypeMap, ExpressionResolutionResult result) { return propertyMap.DestinationPropertyType == typeof(string); }
private static MemberAssignment BindCustomProjectionExpression(PropertyMap propertyMap, TypeMap propertyTypeMap, ExpressionResolutionResult result) { var visitor = new ParameterReplacementVisitor(result.ResolutionExpression); var replaced = visitor.Visit(propertyTypeMap.CustomProjection.Body); return(Expression.Bind(propertyMap.DestinationProperty.MemberInfo, replaced)); }
private static MemberAssignment BindStringExpression(PropertyMap propertyMap, ExpressionResolutionResult result) { return Expression.Bind(propertyMap.DestinationProperty.MemberInfo, Expression.Call(result.ResolutionExpression, "ToString", null, null)); }
public MemberAssignment Build(IConfigurationProvider configuration, PropertyMap propertyMap, TypeMap propertyTypeMap, ExpressionRequest request, ExpressionResolutionResult result, ConcurrentDictionary<ExpressionRequest, int> typePairCount) { return BindStringExpression(propertyMap, result); }
private static MemberAssignment BindEnumerableExpression(IConfigurationProvider configuration, PropertyMap propertyMap, ExpressionRequest request, ExpressionResolutionResult result, ConcurrentDictionary <ExpressionRequest, int> typePairCount) { var destinationListType = GetDestinationListTypeFor(propertyMap); var sourceListType = result.Type.IsArray ? result.Type.GetElementType() : result.Type.GetTypeInfo().GenericTypeArguments.First(); var listTypePair = new ExpressionRequest(sourceListType, destinationListType, request.MembersToExpand); Expression exp = result.ResolutionExpression; if (sourceListType != destinationListType) { var transformedExpression = configuration.ExpressionBuilder.CreateMapExpression(listTypePair, typePairCount); if (transformedExpression == null) { return(null); } exp = Expression.Call( typeof(Enumerable), "Select", new[] { sourceListType, destinationListType }, result.ResolutionExpression, transformedExpression); } if (typeof(IList <>).MakeGenericType(destinationListType) .GetTypeInfo().IsAssignableFrom(propertyMap.DestinationPropertyType.GetTypeInfo()) || typeof(ICollection <>).MakeGenericType(destinationListType) .GetTypeInfo().IsAssignableFrom(propertyMap.DestinationPropertyType.GetTypeInfo())) { // Call .ToList() on IEnumerable exp = GetToListCallExpression(propertyMap, destinationListType, exp); } else if (propertyMap.DestinationPropertyType.IsArray) { // Call .ToArray() on IEnumerable exp = Expression.Call( typeof(Enumerable), "ToArray", new[] { destinationListType }, exp); } if (configuration.AllowNullCollections) { exp = Expression.Condition( Expression.NotEqual( Expression.TypeAs(result.ResolutionExpression, typeof(object)), Expression.Constant(null)), exp, Expression.Constant(null, propertyMap.DestinationPropertyType)); } return(Expression.Bind(propertyMap.DestinationProperty.MemberInfo, exp)); }
private static ExpressionResolutionResult ExpressionResolutionResult( ExpressionResolutionResult expressionResolutionResult, IEnumerable <MemberInfo> sourceMembers) => sourceMembers.Aggregate(expressionResolutionResult, ExpressionResolutionResult);
public bool IsMatch(PropertyMap propertyMap, TypeMap propertyTypeMap, ExpressionResolutionResult result) { return(propertyMap.DestinationPropertyType == typeof(string)); }
public bool CanGetExpressionResolutionResult(ExpressionResolutionResult expressionResolutionResult, PropertyMap propertyMap) => propertyMap.SourceMembers.Any();
public MemberAssignment Build(IConfigurationProvider configuration, PropertyMap propertyMap, TypeMap propertyTypeMap, ExpressionRequest request, ExpressionResolutionResult result, ConcurrentDictionary <ExpressionRequest, int> typePairCount) { return(BindMappedTypeExpression(configuration, propertyMap, request, result, typePairCount)); }
public ExpressionResolutionResult GetExpressionResolutionResult(ExpressionResolutionResult expressionResolutionResult, PropertyMap propertyMap, IValueResolver valueResolver) { var oldParameter = propertyMap.CustomExpression.Parameters.Single(); var newParameter = expressionResolutionResult.ResolutionExpression; var converter = new ParameterConversionVisitor(newParameter, oldParameter); Expression currentChild = converter.Visit(propertyMap.CustomExpression.Body); Type currentChildType = currentChild.Type; return new ExpressionResolutionResult(currentChild, currentChildType); }
public ExpressionResolutionResult GetExpressionResolutionResult(ExpressionResolutionResult expressionResolutionResult, PropertyMap propertyMap, IValueResolver valueResolver) { Expression currentChild = expressionResolutionResult.ResolutionExpression; Type currentChildType = expressionResolutionResult.Type; var nullSubstitute = propertyMap.NullSubstitute; var newParameter = expressionResolutionResult.ResolutionExpression; var converter = new NullSubstitutionConversionVisitor(newParameter, nullSubstitute); currentChild = converter.Visit(currentChild); currentChildType = currentChildType.GetTypeOfNullable(); return new ExpressionResolutionResult(currentChild, currentChildType); }