首页 > 解决方案 > Mapster - 从基类映射后代类

问题描述

课程:

public class Department
{
    public string Name { get; set; }
}

public class DepartmentA : Department
{
    public string NameA { get; set; }
}

public class Employee
{
    public string Name { get; set; }
    public int Salary { get; set; }
    public string Address { get; set; }
    public Department Department { get; set; }
}

public class EmployeeDTO
{
    public string Name { get; set; }
    public int Salary { get; set; }
    public string Address { get; set; }
    public Department Department { get; set; }
}

代码:

DepartmentA departmentA = new DepartmentA { NameA = "depA", Name = "dep" };

Employee emp = new Employee
{
        Name = "James",
        Salary = 20000,
        Address = "London",
        Department = departmentA
};
        
//Mapster
var empDTO = emp.Adapt<EmployeeDTO>();

//AutoMapper
//var config = new MapperConfiguration(cfg => cfg.CreateMap<Employee, EmployeeDTO>());

//var mapper = config.CreateMapper();
//EmployeeDTO empDTO = mapper.Map<EmployeeDTO>(emp);

Console.WriteLine("SourceType:" + emp.Department.GetType().Name);

Console.WriteLine("DestType:" + empDTO.Department.GetType().Name);

如果您运行代码,您将看到 SourceType 和 DestType 不一样。我如何实现它们相同?Mapster 将部门映射为 Department 类(祖先)而不是 DepartmentA 类(后代)。

在此示例中,我知道 emp.Department 中有后代,但在我的应用程序中我不知道。所以这个问题的解决方案必须是通用的。

我试图在 AutoMapper 中解决这个问题。得到了同样的结果。正如@Prolog 在下面写的那样,AutoMapper 正在工作。我更新了主要代码。

如果有人在 Mapster 中解决了问题,我仍然很感兴趣。

标签: mappingautomapperdescendantmapster

解决方案


您需要使用ShallowCopyForSameType,AutoMapper 将只执行深拷贝声明的类型,Mapster 对所有类型执行深拷贝。


推荐阅读