Mapping Mapster-从基类映射子类

Mapping Mapster-从基类映射子类,mapping,automapper,descendant,mapster,Mapping,Automapper,Descendant,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 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=newdepartmenta{NameA=“depA”,Name=“dep”};
员工emp=新员工
{
Name=“詹姆斯”,
工资=20000,
地址=“伦敦”,
系
};
//地图绘制者
var empDTO=emp.Adapt();
//汽车制造商
//var config=new-MapperConfiguration(cfg=>cfg.CreateMap());
//var mapper=config.CreateMapper();
//EmployeeDTO empDTO=mapper.Map(emp);
WriteLine(“SourceType:+emp.Department.GetType().Name”);
WriteLine(“DestType:+empDTO.Department.GetType().Name”);
如果运行代码,您将看到SourceType和DestType不同。我如何实现它们是相同的?Mapster将部门映射为部门类(祖先),而不是部门类(后代)。

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


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

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

您需要使用,AutoMapper将只对声明的类型执行深度复制,Mapster将对所有类型执行深度复制。

我无法使用AutoMapper重现您的问题。它成功地将员工映射到具有相同类型目标的DTO
部门A
。请再检查一遍。@Prolog:你说得对。它正在与automapper合作。我刚刚在不同的计算机上制作了另一个示例(现在我无法访问原始示例)。我将更新代码。
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);