我是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
(目标类),我该如何指定映射规则?换句话说,我应该如何处理上面的代码行(***)?
答案 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()将提示错误