AutoMapper not mapped IncludeMembers with inheritance (interface or abstract base class)

Viewed 36

Source class hierarchy:

    public interface IBase {}

    public interface IChild1 : IBase { }

    public interface IChild2 : IBase { }

    public class A
    {
        public IBase Foo { get; set; }
    }

    public class B : IChild1
    {
        public int AA { get; set; }
    }

    public class C : IChild2
    {
        public bool BB { get; set; }
    }

And Destination type:

public class Dest
{
    public int AA { get; set; }
        
    public bool BB { get; set; }
}

AutoMapper configuration:

var config = new MapperConfiguration(c =>
            {
                c.CreateMap<A, Dest>()
                    .IncludeMembers(x => x.Foo);    //  Error!

                c.CreateMap<IBase, Dest>()
                    .Include<B, Dest>()
                    .Include<C, Dest>();
                c.CreateMap<B, Dest>()
                    .IncludeBase<IBase, Dest>();
                c.CreateMap<C, Dest>()
                    .IncludeBase<IBase, Dest>();
            });

I try map A -> Dest, expect inner object Foo flattening mapped in Dest but it's not happening

var a = new A()
{
    Foo = new B
    {
        AA = 42
    }
};

var r1 = mapper.Map<IBase, Dest>((IBase) new B
{
    AA = 42
});

Assert.Equal(42, r1.AA);    //  Success
Assert.False(r1.BB);                    //  Success

var r = mapper.Map<Dest>(a);

Assert.Equal(42, r.AA);             //  Fail
Assert.False(r.BB);

I think there is an error in the automapper method IncludeMembers, or am I wrong in the config somewhere?

0 Answers
Related