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

本文关键字:何指定 映射 规则 属性 | 更新日期: 2023-09-27 17:58:17

我是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类属性"name"的名称与EmployeeDto类属性"FullName

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

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

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

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

没关系,我自己找到了一个解决方案:

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();

我们还可以指定映射的类属性

发件人https://docs.automapper.org/en/stable/Conventions.html#attribute-支持

属性支持

AddMemberConfiguration().AddName<SourceToDestinationNameMapperAttributesMember>();*当前总是在上

查找的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; }
    }

通过这种方式,你通常知道你要遵循哪个属性。并且您要确保命名约定,所以如果您更改了源中的属性名称。MapTo()将提示错误

通过数据注释进行属性映射的新样式:

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"));

这将映射";"发展";作为目标数据的Department属性值。