Automapper - 将抽象映射到抽象

Automapper - map abstract to abstract

来源classes:

public abstract class ApplicationDriverEquipmentFormAbstractVM
{
    [StringLength(256)]
    public string Make { get; set; }
    [StringLength(256)]
    public string Model { get; set; }
    [StringLength(256)]
    public string Year { get; set; }
    [StringLength(256)]
    public string PlateNumber { get; set; }
    [StringLength(256)]
    public string CurrentMileage { get; set; }
}

public class ApplicationDriverEquipmentTractorFormVM : ApplicationDriverEquipmentFormAbstractVM
{
    [StringLength(256)]
    public string VINNumber { get; set; }
}

public class ApplicationDriverEquipmentTrailerFormVM : ApplicationDriverEquipmentFormAbstractVM
{
    [StringLength(256)]
    public string Length { get; set; }
}

public class ApplicationDriverEquipmentStraightTruckFormVM : ApplicationDriverEquipmentFormAbstractVM
{
    [StringLength(256)]
    public string VINNumber { get; set; }
    [StringLength(256)]
    public string Length { get; set; }
}

public class ApplicationDriverEquipmentCargoVanFormVM : ApplicationDriverEquipmentFormAbstractVM
{
    [StringLength(256)]
    public string VINNumber { get; set; }
    [StringLength(256)]
    public string Length { get; set; }
}


public class ApplicationDriverFormVM
{
    public ApplicationDriverEquipmentTractorFormVM EquipmentTractor { get; set; }
    public ApplicationDriverEquipmentTrailerFormVM EquipmentTrailer { get; set; }
    public ApplicationDriverEquipmentStraightTruckFormVM EquipmentStraightTruck { get; set; }
    public ApplicationDriverEquipmentCargoVanFormVM EquipmentCargoVan { get; set; }

}

然后我想把它映射到目的地class的设备属性,描述如下:

public class ApplicationDriverDomain
{
    public List<ApplicationDriverEquipmentAbstractDomain> Equipments { get; set; }
}

public abstract class ApplicationDriverEquipmentAbstractDomain
{
    public int Id { get; set; }
    public string Make { get; set; }
    public string Model { get; set; }
    public string Year { get; set; }
    public string PlateNumber { get; set; }
    public string CurrentMileage { get; set; }
    public string Type { get; protected set; }
}

public class ApplicationDriverEquipmentTractorDomain : ApplicationDriverEquipmentAbstractDomain
{
    public ApplicationDriverEquipmentTractorDomain()
    {
        Type = ApplicationDriverEquipmentTypeStaticStringsDomain.Tractor;
    }
    public string VINNumber { get; set; }
}

public class ApplicationDriverEquipmentTrailerDomain : ApplicationDriverEquipmentAbstractDomain
{
    public ApplicationDriverEquipmentTrailerDomain()
    {
        Type = ApplicationDriverEquipmentTypeStaticStringsDomain.Trailer;
    }

    public string Length { get; set; }
}

public class ApplicationDriverEquipmentStraightTruckDomain : ApplicationDriverEquipmentAbstractDomain
{
    public ApplicationDriverEquipmentStraightTruckDomain()
    {
        Type = ApplicationDriverEquipmentTypeStaticStringsDomain.StraightTruck;
    }

    public string VINNumber { get; set; }
    public string Length { get; set; }
}

public class ApplicationDriverEquipmentCargoVanDomain : ApplicationDriverEquipmentAbstractDomain
{
    public ApplicationDriverEquipmentCargoVanDomain()
    {
        Type = ApplicationDriverEquipmentTypeStaticStringsDomain.CargoVan;
    }

    public string VINNumber { get; set; }
    public string Length { get; set; }
}

我编写了以下自动映射器规则:

        CreateMap<ViewModels.ApplicationDriverEquipmentFormAbstractVM, ApplicationDriverEquipmentAbstractDomain>();

        CreateMap<ViewModels.ApplicationDriverEquipmentTractorFormVM, ApplicationDriverEquipmentTractorDomain>();
        CreateMap<ViewModels.ApplicationDriverEquipmentTrailerFormVM, ApplicationDriverEquipmentTrailerDomain>();
        CreateMap<ViewModels.ApplicationDriverEquipmentStraightTruckFormVM, ApplicationDriverEquipmentStraightTruckDomain>();
        CreateMap<ViewModels.ApplicationDriverEquipmentCargoVanFormVM, ApplicationDriverEquipmentCargoVanDomain>();

        CreateMap<ViewModels.ApplicationDriverFormVM, ApplicationDriverDomain>()
            .ForMember(dest => dest.Equipments, opt => opt.MapFrom(src => new List<ViewModels.ApplicationDriverEquipmentFormAbstractVM>() { src.EquipmentCargoVan, src.EquipmentStraightTruck, src.EquipmentTractor, src.EquipmentTrailer }));

但它不起作用。为什么?

我找到了解决方案。需要声明映射继承:

CreateMap<ViewModels.ApplicationDriverEquipmentFormAbstractVM, ApplicationDriverEquipmentAbstractDomain>()
    .Include<ViewModels.ApplicationDriverEquipmentTractorFormVM, ApplicationDriverEquipmentTractorDomain>()
    .Include<ViewModels.ApplicationDriverEquipmentTrailerFormVM, ApplicationDriverEquipmentTrailerDomain>()
    .Include<ViewModels.ApplicationDriverEquipmentStraightTruckFormVM, ApplicationDriverEquipmentStraightTruckDomain>()
    .Include<ViewModels.ApplicationDriverEquipmentCargoVanFormVM, ApplicationDriverEquipmentCargoVanDomain>();

相关文档:

https://github.com/AutoMapper/AutoMapper/wiki/Mapping-inheritance