Скопировать объект в объект (с помощью Automapper?) - программирование
Подтвердить что ты не робот

Скопировать объект в объект (с помощью Automapper?)

У меня есть класс:

public class Person {
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

У меня есть два экземпляра Person (person1 и person2). Я хотел бы скопировать содержимое person2 в person1. Я хотел бы сделать эту копию в одной инструкции и не по свойству:

person1.LastName = person2.LastName;

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

4b9b3361

Ответ 1

Как я понимаю, OP не хочет клонировать person2 в новый экземпляр Person, но просит, как скопировать содержимое person2 в уже существующий экземпляр (person1) Человек. Существует перегрузка метода AutoMapper Mapper.Map, который делает это для вас:

Mapper.CreateMap<Person, Person>();
Mapper.Map<Person, Person>(person2, person1);
//This copies member content from person2 into the _existing_ person1 instance.

Примечание 1: @alexl answer создает новый экземпляр Person. Если у вас есть другие ссылки на экземпляр, на который указывает person1, они не получат (предположительно) желаемое обновление данных, если вы перенаправите переменную person1 в новый экземпляр.

Примечание 2:. Вы должны знать, что (рекурсивная) глубина копирования зависит от того, какие отображения AutoMapper знают в момент отображения!
Если член класса Person говорит о классе Brain, и вы дополнительно сделали Mapper.CreateMap<Brain, Brain>(); перед вызовом копии Mapper.Map<Person, Person>(person2, person1);, тогда person1 сохранит свой текущий экземпляр Brain, но этот Brain получит значения члена person2. Экземпляр Brain, У вас есть глубокая копия.
Но если AutoMapper не имеет отображения Brain-Brain перед копированием, член person1 Brain будет ссылаться на тот же экземпляр Brain, что и на ссылку one person2. То есть вы получите мелкую копию.
Это применяется рекурсивно ко всем членам, поэтому лучше убедиться, что AutoMapper имеет сопоставления для классов-членов, которые вы хотите выполнить глубокой копией, и не имеет сопоставлений для классов-членов, которые вы хотите поместить в мелкую копию.

Альтернативой использованию AutoMapper будет использование подхода, использующего отражение. (Обратите внимание, что код в ссылке делает мелкую копию!)

"Поддержка добавления существующего объекта вместо AutoMapper, создающего сам объект назначения" была добавлена ​​в AutoMapper версии 0.2.

Ответ 2

Так как вы спросили With Automapper? могу ли я предложить вам не использовать AutoMapper?

Вместо этого используйте MemberwiseClone() в методе Clone, например

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public Person Clone()
    {
        return (Person) MemberwiseClone();
    }
}

ОБНОВИТЬ

Важно отметить, что это не достигает первоначального желания person1 скопировать person1 в person2

Однако (как указывает @Jimmy Bogard) использование MemberwiseClone() предпочтительнее, если вам просто нужно сделать копию (клон) объекта.

Например, если вы делаете это:

//I need a copy of person1 please! I'll make a new person object 
//and automapper everything into it!
var person2 = new Person2();
Mapper.Map<Person, Person>(person1, person2)

тогда действительно вы должны/могли бы использовать

//oh wait, i can just use this!
var person2 = person1.Clone()

Ответ 3

Mapper.CreateMap<Person, Person>();

// Perform mapping

var person1 = Mapper.Map<Person, Person>(person2);

Надеюсь, что это поможет.