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?