Автоматизатор: оновіть значення властивостей без створення нового об'єкта


260

Як можна використовувати автоматизатор для оновлення значень властивостей іншого об'єкта без створення нового?

Відповіді:


456

Використовуйте перевантаження, яке приймає існуюче місце призначення:

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

Так, він повертає об’єкт призначення, але це лише для деяких інших незрозумілих сценаріїв. Це той самий об’єкт.


28
Дякую, Джиммі ... Я навмисно тримався подалі від AutoMapper, бо боявся, що крива навчання впливає на мій графік. Я офіційно шкодую, що так довго тримався подалі ... це набагато простіше, ніж я спочатку думав.
Ніл Т.

13
Automapper має бути однією з найкорисніших бібліотек. Я занадто довго уникав цього, набагато занадто довго. Я почав використовувати його сьогодні і дуже здивований, наскільки це просто у використанні.
mcottingham

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
FYI, я виявив, що вам не потрібно вказувати параметри типу. Просто Mapper.Map (джерело, призначення) буде працювати. Приємно і просто!
Іуда Габріель Хіманго

2
Чи змінилася поведінка NULL у версії 4.2.1? Я бачу, що відображення null в об’єкт повертає null; тоді як в 2.2.1 відображення нуля в існуючий об'єкт повертає існуючий об'єкт.
Пітер Маквой

18

Щоб зробити цю роботу, вам потрібно створити CreateMap для типів джерела та місця призначення, навіть якщо вони одного типу. Це означає, що якщо ви хочете, Mapper.Map<User, User>(user1, user2); Вам потрібно створити подібну карту Mapper.Create<User, User>()


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якими він поділився. Значення його унікальних властивостей залишаться однаковими.

Ось відповідний вихідний код

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.