diff --git a/src/AutoMapper.Extensions.ExpressionMapping/MapperExtensions.cs b/src/AutoMapper.Extensions.ExpressionMapping/MapperExtensions.cs index 72ba3d0..1c47e37 100644 --- a/src/AutoMapper.Extensions.ExpressionMapping/MapperExtensions.cs +++ b/src/AutoMapper.Extensions.ExpressionMapping/MapperExtensions.cs @@ -260,17 +260,29 @@ public static Dictionary AddTypeMapping(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 typeMappings, IConfigurationProvider configurationProvider, Type sourceType, Type destType) { - typeMappings.DoAddTypeMappings - ( - configurationProvider, - !sourceType.HasUnderlyingType() ? new List() : ElementTypeHelper.GetElementTypes(sourceType).ToList(), - !destType.HasUnderlyingType() ? new List() : ElementTypeHelper.GetElementTypes(destType).ToList() - ); + if ((sourceType.IsGenericType() && typeof(System.Collections.IEnumerable).IsAssignableFrom(sourceType)) || sourceType.IsArray) + { + typeMappings.DoAddTypeMappings + ( + configurationProvider, + !sourceType.HasUnderlyingType() ? new List() : ElementTypeHelper.GetElementTypes(sourceType).ToList(), + !destType.HasUnderlyingType() ? new List() : ElementTypeHelper.GetElementTypes(destType).ToList() + ); + } + else if (sourceType.IsGenericType() && destType.IsGenericType()) + { + typeMappings.DoAddTypeMappings + ( + configurationProvider, + !sourceType.HasUnderlyingType() ? new List() : sourceType.GetGenericArguments().ToList(), + !destType.HasUnderlyingType() ? new List() : destType.GetGenericArguments().ToList() + ); + } } /// diff --git a/tests/AutoMapper.Extensions.ExpressionMapping.UnitTests/SetPropertyCalls.cs b/tests/AutoMapper.Extensions.ExpressionMapping.UnitTests/SetPropertyCalls.cs new file mode 100644 index 0000000..40fd8f5 --- /dev/null +++ b/tests/AutoMapper.Extensions.ExpressionMapping.UnitTests/SetPropertyCalls.cs @@ -0,0 +1,18 @@ +using System; + +namespace AutoMapper.Extensions.ExpressionMapping.UnitTests +{ + public class SetPropertyCalls + { + public SetPropertyCalls SetProperty( + Func propertyExpression, + Func valueExpression) + => throw new InvalidOperationException(); + + + public SetPropertyCalls SetProperty( + Func propertyExpression, + TProperty valueExpression) + => throw new InvalidOperationException(); + } +} diff --git a/tests/AutoMapper.Extensions.ExpressionMapping.UnitTests/XpressionMapperTests.cs b/tests/AutoMapper.Extensions.ExpressionMapping.UnitTests/XpressionMapperTests.cs index 2195d56..d9216e9 100644 --- a/tests/AutoMapper.Extensions.ExpressionMapping.UnitTests/XpressionMapperTests.cs +++ b/tests/AutoMapper.Extensions.ExpressionMapping.UnitTests/XpressionMapperTests.cs @@ -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, SetPropertyCalls>> exp = s => s.SetProperty(p => p.Description, "newName"); + + //Act + Expression, SetPropertyCalls>> expMapped = mapper.MapExpression, SetPropertyCalls>>>(exp); + + //Assert + Assert.NotNull(expMapped); + } + [Fact] public void Map_accountModel_to_account_with_left_null_checks_against_string_type() {