Skip to content

Open Generics with base generic #3595

@ace210

Description

@ace210

Source/destination types

    public class OpenGenerics_With_Base_Generic : AutoMapperSpecBase
    {
        public class Foo<T>
        {
            public T Value1 { get; set; }
        }

        public class BarBase<T>
        {
            public T Value2 { get; set; }
        }
        public class Bar<T>: BarBase<T>
        {

        }

        protected override MapperConfiguration Configuration { get; } = new MapperConfiguration(mapper => {
            mapper.CreateMap(typeof(Foo<>), typeof(Bar<>)).ForMember("Value2", to => to.MapFrom("Value1"));
        });

        [Fact]
        public void Can_map_base_members()
        {
            var dest = Mapper.Map<Bar<int>>(new Foo<int> { Value1 = 5 });
            dest.Value2.ShouldBe(5);
        }
    }

Steps to reproduce

Run this test output:

---------- Starting test run ----------
[xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v2.4.1 (32-bit Desktop .NET 4.0.30319.42000)
[xUnit.net 00:00:00.38]   Starting:    AutoMapper.UnitTests
[xUnit.net 00:00:00.66]     AutoMapper.UnitTests.OpenGenerics_With_Base_Generic.Can_map_base_members [FAIL]
[xUnit.net 00:00:00.67]       System.ArgumentException : Property 'T Value2' is not defined for type 'AutoMapper.UnitTests.OpenGenerics_With_Base_Generic+Bar`1[System.Int32]'
[xUnit.net 00:00:00.67]       Stack Trace:
[xUnit.net 00:00:00.67]            at System.Linq.Expressions.Expression.Property(Expression expression, PropertyInfo property)
[xUnit.net 00:00:00.67]            at System.Linq.Expressions.Expression.MakeMemberAccess(Expression expression, MemberInfo member)
[xUnit.net 00:00:00.67]         src\AutoMapper\Execution\TypeMapPlanBuilder.cs(358,0): at AutoMapper.Execution.TypeMapPlanBuilder.CreatePropertyMapFunc(IMemberMap memberMap, Expression destination, MemberInfo destinationMember)
[xUnit.net 00:00:00.67]         src\AutoMapper\Execution\TypeMapPlanBuilder.cs(333,0): at AutoMapper.Execution.TypeMapPlanBuilder.TryPropertyMap(PropertyMap propertyMap)
[xUnit.net 00:00:00.67]         src\AutoMapper\Execution\TypeMapPlanBuilder.cs(190,0): at AutoMapper.Execution.TypeMapPlanBuilder.CreateAssignmentFunc(Expression destinationFunc)
[xUnit.net 00:00:00.67]         src\AutoMapper\Execution\TypeMapPlanBuilder.cs(62,0): at AutoMapper.Execution.TypeMapPlanBuilder.CreateMapperLambda(HashSet`1 typeMapsPath)
[xUnit.net 00:00:00.67]         src\AutoMapper\TypeMap.cs(300,0): at AutoMapper.TypeMap.CreateMapperLambda(IConfigurationProvider configurationProvider, HashSet`1 typeMapsPath)
[xUnit.net 00:00:00.67]         src\AutoMapper\TypeMap.cs(294,0): at AutoMapper.TypeMap.Seal(IConfigurationProvider configurationProvider)
[xUnit.net 00:00:00.67]         src\AutoMapper\MapperConfiguration.cs(188,0): at AutoMapper.MapperConfiguration.ResolveTypeMap(TypePair typePair)
[xUnit.net 00:00:00.67]         src\AutoMapper\MapperConfiguration.cs(112,0): at AutoMapper.MapperConfiguration.BuildExecutionPlan(MapRequest mapRequest)
[xUnit.net 00:00:00.67]         src\AutoMapper\MapperConfiguration.cs(100,0): at AutoMapper.MapperConfiguration.CompileExecutionPlan(MapRequest mapRequest)
[xUnit.net 00:00:00.67]         src\AutoMapper\Internal\LockingConcurrentDictionary.cs(15,0): at AutoMapper.Internal.LockingConcurrentDictionary`2.<>c__DisplayClass2_1.<.ctor>b__1()
[xUnit.net 00:00:00.67]            at System.Lazy`1.CreateValue()
[xUnit.net 00:00:00.67]            at System.Lazy`1.LazyInitValue()
[xUnit.net 00:00:00.67]            at System.Lazy`1.get_Value()
[xUnit.net 00:00:00.67]         src\AutoMapper\Internal\LockingConcurrentDictionary.cs(18,0): at AutoMapper.Internal.LockingConcurrentDictionary`2.GetOrAdd(TKey key)
[xUnit.net 00:00:00.67]         src\AutoMapper\MapperConfiguration.cs(96,0): at AutoMapper.MapperConfiguration.GetExecutionPlan(MapRequest mapRequest)
[xUnit.net 00:00:00.67]         src\AutoMapper\MapperConfiguration.cs(86,0): at AutoMapper.MapperConfiguration.GetExecutionPlan[TSource,TDestination](MapRequest mapRequest)
[xUnit.net 00:00:00.67]         src\AutoMapper\Mapper.cs(94,0): at AutoMapper.Mapper.MapCore[TSource,TDestination](TSource source, TDestination destination, ResolutionContext context, Type sourceType, Type destinationType, IMemberMap memberMap)
[xUnit.net 00:00:00.67]         src\AutoMapper\Mapper.cs(44,0): at AutoMapper.Mapper.Map[TSource,TDestination](TSource source, TDestination destination)
[xUnit.net 00:00:00.67]         src\AutoMapper\Mapper.cs(34,0): at AutoMapper.Mapper.Map[TDestination](Object source)
[xUnit.net 00:00:00.67]         src\UnitTests\OpenGenerics.cs(442,0): at AutoMapper.UnitTests.OpenGenerics_With_Base_Generic.Can_map_base_members()
[xUnit.net 00:00:00.70]   Finished:    AutoMapper.UnitTests
========== Test run finished: 2 Tests run in 1,9 sec (1 Passed, 1 Failed, 0 Skipped) ==========

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions