2012-04-02 1 views
5

Automapper를 사용하여 동일한 유형의 두 객체를 가져 와서 변경된 새 값을 매핑합니다. 나는 아래의 코드를 사용해 보았지만, 에러를 던지기 시작했다. 오토매 퍼로도 달성 할 수 있는지조차 확신 할 수 없다. 예를 들어AutoMapper - 동일한 소스 및 대상 객체 유형을 사용하는지도

:

 Mapper.CreateMap<UserDetails, UserDetails>(); 
     UserDetails userDetails = Mapper.Map<UserDetails, UserDetails>(userDetailsCurrent, userDetailsNew); 

는 기본적으로, 기존 개체 "userDetailsCurrent"에 새 개체 "userDetailsNew"에서 온 새로운 값을 통해 복사해야합니다 - 그들은 동일한 유형의 경우에도 . 이 방법으로 기존 값을 새 값으로 "업데이트"할 수 있습니다. 내가이 일을하는 이유는 사용자 세부 정보가 전달 될지 확실하지 않기 때문입니다. 도착할 때와 같이 매핑해야합니다.

나는 Automapper를 사용하여 비슷한 속성을 가진 다른 객체를 매핑합니다. 그러나 Automapper의 힘을 사용하여 같은 방식으로이 방법을 사용할 수 있다고 생각했습니다. 더 나은 해결책이있을 수도 있습니다 - 어떤 도움을 주시면 감사하겠습니다!

+0

'Mapper.Map'은'UserDetails' 또는 'UserSession'을 반환해야합니까? –

+0

UserDetails가 반환됩니다. 코드 샘플을 업데이트했습니다. – Deano

+0

어떤 오류가 발생하고 있습니까? –

답변

6

이것은 나를 위해 작동하는 것 같습니다. 내 사용자 정의 유형 :

class MyType 
{ 
    public int MyInt { get; set; } 
    public string MyString { get; set; } 
} 

내 매핑 코드 : 간단한 속성을 넘어 사용자 정의 유형에 대한 흥미로운 무엇

Mapper.CreateMap<MyType, MyType>(); 
var source = new MyType() {MyInt = 1, MyString = "Hello world"}; 
var dest = Mapper.Map<MyType, MyType>(source); 

?

+0

잘 생겼어. 내 PC 근처에 있지 않아서 아프지 않아 빨리 확인해! – Deano

+0

ForMember()를 사용하지 않고도 할 수있는 방법이 있습니까? Object의 각 속성에 대해 그렇게하지 않는 것이 더 깔끔할 수 있습니다. – Deano

+0

ForMember를하지 않으면 그래도 작동합니다. 나는 처음에 포함시킨 것들을 사용하는 데 익숙하다. –

4

튜플을 사용하거나 Automapper의 추상 TypeConverter 클래스에서 파생 된 사용자 정의 형식 변환기를 만들어서 수행 할 수 있습니다.

당신의 원본 및 대상 클래스했다 말 : 그럼 당신은

var orginal = new Person() {FirstName = "Clifford", LastName = "Mayson"}; 
     var updated = new Person() {FirstName = "Cliff"}; 

     Mapper.CreateMap<Tuple<Person, Person>, Person>().ConvertUsing<CustomerPersonConverter>(); 

     var result = Mapper.Map<Person>(new Tuple<Person, Person>(orginal, updated)); 

     Console.WriteLine(result); 

처럼 사용할 수

public class CustomerPersonConverter : TypeConverter<Tuple<Person, Person>, Person> 
{ 
    protected override Person ConvertCore(Tuple<Person, Person> source) 
    { 
     var orginalValues = source.Item1; 
     var updatedValues = source.Item2; 

     var result = new Person 
      { 
       FirstName = string.IsNullOrEmpty(updatedValues.FirstName) ? orginalValues.FirstName : updatedValues.FirstName, 
       LastName = string.IsNullOrEmpty(updatedValues.LastName) ? orginalValues.LastName : updatedValues.LastName 
      }; 

     return result; 
    } 
} 

로 사용자 정의 변환 유형을 만들 수

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

    public override string ToString() 
    { 
     return string.Format("Firstname: {0}, Lastname: {1}", FirstName, LastName); 
    } 
} 

을 어느 갱신에서 누락되었지만 원래의 성 값을 유지하는 결과를 생성하지만 upda firstname 값 예.

Firstname: Cliff, Lastname: Mayson 
+0

예를 들어 주셔서 감사합니다. – PratikSatikunvar

관련 문제