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

时间:2013-02-08 17:00:32

标签: c# automapper

我是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的属性“ FullName ”的名称不同类。

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

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

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

4 个答案:

答案 0 :(得分:248)

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

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

答案 1 :(得分:2)

确实是旧线程,但是只是使用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();

答案 2 :(得分:2)

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

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

属性支持

AddMemberConfiguration().AddName<SourceToDestinationNameMapperAttributesMember>(); *当前始终打开

寻找以下来源的SourceToDestinationMapperAttribute实例 属性/字段并调用用户定义的isMatch函数以查找 成员匹配。

MapToAttribute是其中之一,它将根据以下属性进行匹配 提供的名称。

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

答案 3 :(得分:0)

考虑到我们有两个班级

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()将提示错误