Automapper: обновление значений свойств без создания нового объекта

260

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

ryudice
источник

Ответы:

456

Используйте перегрузку, которая принимает существующее назначение:

Mapper.Map<Source, Destination>(source, destination);

Да, он возвращает целевой объект, но это только для некоторых других непонятных сценариев. Это тот же объект.

Джимми Богард
источник
28
Спасибо, Джимми ... Я намеренно держался подальше от AutoMapper, потому что боялся, что кривая обучения повлияет на мой график. Мне официально жаль, что я так долго оставался в стороне ... это намного проще, чем я думал.
Нил Т.
13
Automapper должен быть одной из самых полезных библиотек. Я слишком долго избегал этого, слишком долго. Я начал использовать его сегодня и очень удивлен тем, насколько легко им пользоваться.
Маккоттингем
4
Не работа для меня. Я пытаюсь сопоставить с тем же типом, но он возвращает новый объект. Пользователь u1, u3 = новый пользователь (); u1 = новый пользователь {Id = 1, NickName = "vami"}; Пользователь u4 = Mapper.Map (u1, u3); Assert.AreEqual (u1.Id, u3.Id); Assert.AreEqual (u1.NickName, u3.NickName);
Петр
7
К вашему сведению, я обнаружил, что вам не нужно указывать параметры типа. Просто Mapper.Map (источник, место назначения) будет работать. Красиво и просто!
Иуда Габриэль Химанго
2
Изменилось ли поведение NULL в выпуске 4.2.1? Я вижу, что отображение null в объект возвращает null; тогда как в 2.2.1 отображение null в существующий объект вернуло существующий объект.
Питер МакЭвой
18

Чтобы сделать это, вы должны создать CreateMap для типов источника и назначения, даже если они одного типа. Это означает, что если вы хотите, Mapper.Map<User, User>(user1, user2); вам нужно создать карту, как это Mapper.Create<User, User>()

Flux Xu
источник
1
Ха! Я только что нашел то же самое и добавил комментарий к принятому ответу. ИМХО, принятый ответ без вашего объяснения
Анджей Мартина
Это отличное дополнение. Однако в первоначальном вопросе не упоминались типы источника и назначения, и не требовалось, чтобы они были одного типа.
Jpaugh
4

Если вы хотите использовать метод экземпляра IMapper, а не статический метод, используемый в принятом ответе, вы можете сделать следующее (проверено в AutoMapper 6.2.2)

IMapper _mapper;
var config = new MapperConfiguration(cfg =>
{
    cfg.CreateMap<Source, Destination>();
});
_mapper = config.CreateMapper();

Source src = new Source
{
//initialize properties
}

Destination dest = new dest
{
//initialize properties
}
_mapper.Map(src, dest);

destтеперь будет обновлено со всеми значениями свойств из того, srcчто он поделился. Значения его уникальных свойств останутся прежними.

Вот соответствующий исходный код

BobbyA
источник