Gringo Gringo - 1 year ago 171
C# Question

AutoMapper and inheritance - How to Map?

Have this scenario:

Public class Base { public string Name; }

Public Class ClassA :Base { public int32 Number; }

Public Class ClassB :Base { Public string Description;}

Public Class DTO {
public string Name;
public int32 Number;
Public string Description;

I have an

my maps are:

AutoMapper.Mapper.CreateMap<IList<Base>, IList<DTO>>()
.ForMember(dest => dest.Number, opt => opt.Ignore())
.ForMember(dest => dest.Description, opt => opt.Ignore());

AutoMapper.Mapper.CreateMap<ClassA, DTo>()
.ForMember(dest => dest.Description, opt => opt.Ignore());

AutoMapper.Mapper.CreateMap<ClassB, DTO>()
.ForMember(dest => dest.Number, opt => opt.Ignore())

Mapper.AssertConfigurationIsValid(); //Is OK!

But Properties that are in ClassA Or ClassB are not mapped when I do this :

IList<DTO>= AutoMapper.Mapper.Map<IList<Base>,IList<DTO>>(baseList);

How can I do to map properties that are defined in

Answer Source

You will need to create DTO classes that match your domain classes like this:

public class DTO
    public string Name;

public class DTO_A : DTO
    public int Number { get; set; }

public class DTO_B : DTO
    public string Description { get; set; }

You then need to change your mappings to this:

        Mapper.CreateMap<Base, DTO>()
            .Include<ClassA, DTO_A>()
            .Include<ClassB, DTO_B>();

        Mapper.CreateMap<ClassA, DTO_A>();

        Mapper.CreateMap<ClassB, DTO_B>();


Once this is done, then the following will work:

        var baseList = new List<Base>
            new Base {Name = "Base"},
            new ClassA {Name = "ClassA", Number = 1},
            new ClassB {Name = "ClassB", Description = "Desc"},

        var test = Mapper.Map<IList<Base>,IList<DTO>>(baseList);

Unfortunately this does mean that you have an unwanted cast, but I don't think there's much that you can do about that.

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download