IT TIP

객체를 객체로 복사 (Automapper? 사용)

itqueen 2020. 11. 30. 20:30
반응형

객체를 객체로 복사 (Automapper? 사용)


수업이 있습니다.

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

두 개의 Person 인스턴스 (person1 및 person2)가 있습니다. person2의 내용을 person1에 복사하고 싶습니다. 속성 별 속성이 아닌 하나의 명령으로이 복사본을 만들고 싶습니다 .

person1.LastName = person2.LastName;

문서에서 객체를 다른 객체로 복사하는 것을 보았지만 유형이 다릅니다. 유형이 같을 때 객체를 어떻게 복사 할 수 있습니까?


내가 질문을 이해로서, 영업 이익은 복제에 원하지 않는 PERSON2 의 새로운 인스턴스에 한 사람 만의 내용을 복사하는 방법에 대한 요구하고있다 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의 답변은 Person 인스턴스를 만듭니다 . person1이 가리키는 인스턴스에 대한 다른 참조가있는 경우 person1 변수를 새 인스턴스로 리디렉션하면 (아마도) 원하는 데이터 업데이트를 얻지 못할 것 입니다.

참고 2 : (재귀 적) 복사 깊이는 AutoMapper가 매핑 순간에 알고있는 매핑에 따라 달라진다는 점을 알고 있어야합니다! Person 클래스
의 멤버가 Brain 클래스 이고 복사 데이터 호출 전에 추가로 수행 한 경우 person1 은 현재 Brain 인스턴스를 유지 하지만이 Brainperson2Brain 인스턴스 의 멤버 값을 받습니다 . 그것은 당신이 깊은 사본 을 가지고 있다는 것입니다 . 그러나 AutoMapper 후 복사하기 전에 뇌 - 뇌 매핑이없는 경우 PERSON1 의 ' 뇌를Mapper.CreateMap<Brain, Brain>();Mapper.Map<Person, Person>(person2, person1);
멤버는 person2 가 참조하는 것과 동일한 Brain 인스턴스를 참조합니다. 그것은 당신이 얕은 복사본 을 얻을 것 입니다. 이는 모든 멤버에 반복적으로 적용되므로 AutoMapper에 전체 복사하려는 멤버 클래스에 대한 매핑이 있고 얕은 복사하려는 멤버 클래스에 대한 매핑이 없는지 확인하는 것이 좋습니다.

AutoMapper 사용에 대한 대안은 리플렉션 을 사용 하는 접근 방식 을 사용 하는입니다. (링크의 코드는 얕은 복사를 수행합니다!)

"AutoMapper가 대상 객체 자체를 생성하는 대신 기존 객체를 채우기위한 지원"이 AutoMapper 버전 0.2추가되었습니다 .


당신이 질문 때문에 With Automapper?내가 제안 할 수 있습니다 당신은 AutoMapper를 사용하지 않는?

대신에 사용 MemberwiseClone()A의 Clone방법, 예를 들어,

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

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

최신 정보

원래 포스터를 acheive하지 않는이주의하는 것이 그 중요한 복사 욕망 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()

Mapper.CreateMap<Person, Person>();

// Perform mapping

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

도움이 되었기를 바랍니다.


Automapper를 사용하는 이유는 무엇입니까? 간단한 복제가 당신을 위해 일을 할 것입니다.

자세히 알아보기 : 딥 클로닝 객체

참고 URL : https://stackoverflow.com/questions/5713556/copy-object-to-object-with-automapper

반응형