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


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.