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


144

我是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;}
}

注意:类的属性“ Name ”的名称Employee类的属性“ FullName ”的名称不同EmployeeDto

这是将Employee对象映射到的代码EmployeeDto

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

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

Answers:


292

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

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

1
有没有办法为任何类全局地指定它,例如前缀/后缀之类?例如,我有一堆类,每个类都有“ Localizations”属性。我想将它们映射到相应属性称为“ LocalizedName”的类。我唯一的选择是将ForMember添加到每个映射配置中吗?
NickAb '16

2
Mapper类中没有CreateMap方法:(
Navid_pdp11 '16

3
@ Navid_pdp11是的。您需要让静态类Mapper不是实例
Jordy van Eijk

@JordyvanEijk您使用的是哪个版本的静态“ CreateMap”方法?在5.1.1.0中没有这样的东西
Matt Thomas

6
@MattThomas看完automapper的github后,我发现从5.0版开始CreateMap已过时,他们说您需要使用MapperConfiguration或Mapper.Initialize。
Jordy van Eijk

7

只是使用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

我们还可以指定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; }
}

逐字引用其他地方的内容时,请确保使用块引号格式以使读者清楚地知道已复制内容。
TylerH


对stackoverflow非常新。确保会遵守规则@TylerH
Pranay DevOps
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.