当属性名称不同时,如何指定映射规则

我是 Automapper 框架的新手,我有一个域类和一个 DTO 类,如下所示:

public class Employee
{
public long Id {get;set;}
public string Name {get;set;}
public string Phone {get;set;}
public string Fax {get;set;}
public DateTime DateOfBirth {get;set;}
}


public class EmployeeDto
{
public long Id {get;set;}
public string FullName {get;set;}
public DateTime DateOfBirth {get;set;}
}

注意: Employee类的属性“ 姓名”的名称与 EmployeeDto类的属性“ 全名”的名称不同。

下面是将 Employee对象映射到 EmployeeDto的代码:

Mapper.CreateMap<Employee, EmployeeDto>(); // code line (***)
EmployeeDto dto = Mapper.Map<Employee, EmployeeDto>(employee);

我的问题是: 如果要将 Employee(源类)映射到 EmployeeDto(目标类) ,如何指定映射规则?换句话说,我应该如何使用上面的代码行(* * *)做更多的事情?

99918 次浏览

没关系,我自己找到了一个解决办法:

Mapper.CreateMap<Employee, EmployeeDto>()
.ForMember(dest => dest.FullName, opt => opt.MapFrom(src => src.Name));

仅仅是将上面的注释转换成使用 Automapper 8.1 + 的更新方法..。

var mapConfig = new MapperConfiguration(
cfg => cfg.CreateMap<Employee, EmployeeDto>()
.ForMember(dest => dest.FullName, opt => opt.MapFrom(src => src.Name))
);

然后使用 mapConfig 构建映射器:

var mapper = mapConfig.CreateMapper();

我们还可以在 Class 属性上指定映射

来自 https://docs.automapper.org/en/stable/Conventions.html#attribute-support

属性支持

AddMemberConfiguration().AddName<SourceToDestinationNameMapperAttributesMember>(); * Now is always on

查找其 SourceToDestinationMapperAttribute 的实例 属性/字段并调用用户定义的 isMatch 函数来查找 会员配对。

MapToAttribute 是其中之一,它将匹配基于 提供的名称。

public class Foo
{
[MapTo("SourceOfBar")]
public int Bar { get; set; }
}

考虑到我们有两节课

public class LookupDetailsBO
{
public int ID { get; set; }


public string Description { get; set; }


}

另一个班级是

public class MaterialBO
{
[MapTo(nameof(LookupDetailsBO.ID))]
public int MaterialId { get; set; }


[MapTo(nameof(LookupDetailsBO.Description))]
public string MaterialName { get; set; }


public int LanguageId { get; set; }
}

通过这种方式,您通常知道要遵循哪个属性。 而且你要确保变数命名原则,所以如果你在源代码中更改了属性名。地图()将提示一个错误

通过数据注释进行属性映射的新风格:

Https://docs.automapper.org/en/v8.1.0/attribute-mapping.html?highlight=annotation

   [AutoMap(typeof(Order))]
public class OrderDto {
// This is equivalent to a CreateMap<Order, OrderDto>()

用于映射成员

   [SourceMember(nameof(Order.OrderTotal))]
public decimal Total { get; set; }

如果您想要反向映射,那么可以将该属性添加到

   [AutoMap(typeof(Order), ReverseMap = true )]
public class OrderDto {
// This is equivalent to a CreateMap<Order, OrderDto>().ReverseMap()

以上的答案是伟大的,希望 OP 得到他的答案。我只是想添加如何我们可以映射固定的值,而不是字段使用 IMemberConfigurationExpression接口的 UseValue()方法。

Mapper.CreateMap<Employee, EmployeeDto>()
.ForMember(dest => dest.Department, opt => opt.UseValue("Development"));

这将把“ Development”映射为目标数据的 Department 属性值。