Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 19 additions & 7 deletions src/AutoMapper.Extensions.ExpressionMapping/MapperExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -260,17 +260,29 @@ public static Dictionary<Type, Type> AddTypeMapping<TSource, TDest>(this Diction

private static bool HasUnderlyingType(this Type type)
{
return (type.IsGenericType() && typeof(System.Collections.IEnumerable).IsAssignableFrom(type)) || type.IsArray;
return (type.IsGenericType() && type.GetGenericArguments().Length > 0) || type.IsArray;
}

private static void AddUnderlyingTypes(this Dictionary<Type, Type> typeMappings, IConfigurationProvider configurationProvider, Type sourceType, Type destType)
{
typeMappings.DoAddTypeMappings
(
configurationProvider,
!sourceType.HasUnderlyingType() ? new List<Type>() : ElementTypeHelper.GetElementTypes(sourceType).ToList(),
!destType.HasUnderlyingType() ? new List<Type>() : ElementTypeHelper.GetElementTypes(destType).ToList()
);
if ((sourceType.IsGenericType() && typeof(System.Collections.IEnumerable).IsAssignableFrom(sourceType)) || sourceType.IsArray)
{
typeMappings.DoAddTypeMappings
(
configurationProvider,
!sourceType.HasUnderlyingType() ? new List<Type>() : ElementTypeHelper.GetElementTypes(sourceType).ToList(),
!destType.HasUnderlyingType() ? new List<Type>() : ElementTypeHelper.GetElementTypes(destType).ToList()
);
}
else if (sourceType.IsGenericType() && destType.IsGenericType())
{
typeMappings.DoAddTypeMappings
(
configurationProvider,
!sourceType.HasUnderlyingType() ? new List<Type>() : sourceType.GetGenericArguments().ToList(),
!destType.HasUnderlyingType() ? new List<Type>() : destType.GetGenericArguments().ToList()
);
}
}

/// <summary>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
using System;

namespace AutoMapper.Extensions.ExpressionMapping.UnitTests
{
public class SetPropertyCalls<TSource>
{
public SetPropertyCalls<TSource> SetProperty<TProperty>(
Func<TSource, TProperty> propertyExpression,
Func<TSource, TProperty> valueExpression)
=> throw new InvalidOperationException();


public SetPropertyCalls<TSource> SetProperty<TProperty>(
Func<TSource, TProperty> propertyExpression,
TProperty valueExpression)
=> throw new InvalidOperationException();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -884,6 +884,19 @@ public void Map_accountModel_to_account_with_null_checks_against_string_type()
Assert.True(accounts.Count == 0);
}

[Fact]
public void Map_SetPropertyCalls()
{
//Arrange
Expression<Func<SetPropertyCalls<AccountModel>, SetPropertyCalls<AccountModel>>> exp = s => s.SetProperty(p => p.Description, "newName");

//Act
Expression<Func<SetPropertyCalls<Account>, SetPropertyCalls<Account>>> expMapped = mapper.MapExpression<Expression<Func<SetPropertyCalls<Account>, SetPropertyCalls<Account>>>>(exp);

//Assert
Assert.NotNull(expMapped);
}

[Fact]
public void Map_accountModel_to_account_with_left_null_checks_against_string_type()
{
Expand Down