Как указать правило отображения, когда имена свойств различаются

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

Примечание. Имя свойства « Имя » Employeeкласса не совпадает с именем свойства « Полное имя » EmployeeDtoкласса.

А вот код для сопоставления Employeeобъекта EmployeeDto:

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

Мой вопрос: если я хочу отобразить Employee(исходный класс) на EmployeeDto(целевой класс), как я могу указать правило сопоставления? Другими словами, как мне сделать больше с строкой кода (***) выше?

Thomas.Benz
источник

Ответы:

292

Неважно, я сам нашел решение:

Mapper.CreateMap<Employee, EmployeeDto>()
    .ForMember(dest => dest.FullName, opt => opt.MapFrom(src => src.Name));
Thomas.Benz
источник
1
Есть ли способ указать его глобально для любого класса, что-то вроде префикса / суффикса? Например, у меня есть несколько классов библиотеки, каждый из которых имеет свойство «Локализации». И я хочу сопоставить их с классами, где соответствующее свойство называется «LocalizedName». Мой единственный вариант - добавить ForMember к каждой конфигурации сопоставления?
NickAb
2
в классе Mapper нет метода CreateMap :(
Navid_pdp11
3
@ Navid_pdp11 да, есть. У вас должен быть статический класс Mapper, а не экземпляр
Джорди ван Эйк
@JordyvanEijk В какой версии вы используете статический метод «CreateMap»? В 5.1.1.0 такого не бывает
Мэтт Томас
6
@MattThomas После просмотра github automapper я вижу, что начиная с версии 5.0 CreateMap устарел, и они говорят, что вам нужно использовать MapperConfiguration или Mapper.Initialize.
Джорди ван Эйк
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();
ebol2000
источник
2

Мы также можем указать атрибуты класса для отображения

С 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; }
}
Pranay DevOps
источник
При цитировании контента дословно, не забудьте использовать форматирование блочной цитаты, чтобы читателям было ясно, что контент копируется.
TylerH
Проверьте новый стиль :) docs.automapper.org/en/latest/Attribute-mapping.html
Лучиан Баргаоану
Очень новичок в stackoverflow. Конечно , будет следовать правилам @TylerH
Pranay DevOps