2016-09-08 1 views
1

다음 코드가 있습니다.
모든 필드는 원본에서 대상 개체로 잘 매핑됩니다.
그러나 대상 개체에는 계산해야 할 필드가 하나 있습니다.AutoMapper에서 사용자 지정 논리를 추가하려면 어떻게해야합니까?

예 : DestinationObj.Status는 sourceobj의 특정 필드에 따라 설정할 수 있습니다.

내가 코드를 작성한다면 그것과 유사합니다 :

 foreach (var rec in listData) 
     { 
      string status; 

      if (!String.IsNullOrEmpty(rec.Field1)) 
      { 
       status = "Stage 1"; 
      } 
      if (!String.IsNullOrEmpty(rec.Field2)) 
      { 
       status = "Stage 2"; 
      } 
      if (!String.IsNullOrEmpty(rec.Field3)) 
      { 
       status = "Stage 3"; 
      } 

     } 

내가 AutoMapper에서 비슷한 일을 할 수 있습니까?

 var config = new MapperConfiguration(c => 
     { 
      c.CreateMap<SourceObj, DestinationObj>() 
       .ForMember(x => x.Status, m => m.MapFrom([Not sure at this point ])); 

     }); 

편집 : 목록 destinObj = 새 목록();

foreach (var rec in listSourceObject) 
      { 
       destinationObj do = new destinationObj(); 
       // Manually map all of the fields... 


       string status; 

       if (!String.IsNullOrEmpty(rec.Field1)) 
       { 
        do.status = "Stage 1"; 
       } 
       if (!String.IsNullOrEmpty(rec.Field2)) 
       { 
        do.status = "Stage 2"; 
       } 
       if (!String.IsNullOrEmpty(rec.Field3)) 
       { 
        do. status = "Stage 3"; 
       } 
       destinObj.Add(do); 
      } 
+1

'listData'는 어디에서 왔습니까? '상태'는 어디로 이동합니까? 적용하려는 메소드가 맵핑과 관련이없는 것처럼 보입니다. – krillgar

+0

수정 코드를 정리했습니다. – PrivateJoker

+0

아직 명확하지 않습니다. 두 객체가 모두 자신의 컬렉션입니까? – krillgar

답변

2

가장 쉬운 방법은 매퍼 클래스로 메소드를 이동하는 것입니다. 그런 다음 .MapFrom()에서 해당 메소드에 액세스 할 수 있습니다.

var config = new MapperConfiguration(c => 
{ 
    c.CreateMap<SourceObj, DestinationObj>() 
     .ForMember(x => x.Status, m => m.MapFrom(src => MapStatus(src)); 

}); 

private string MapStatus(SourceObject source) 
{ 
    // Whatever that foreach loop actually does. 
} 
3

MapFrom()의 제안 된 해결 방법과 표현식에 대한 대안은 전적으로 정확하지 않습니다. MapFrom() (AutoMapper: What is the difference between MapFrom and ResolveUsing?으로 제안 됨)은 더 스마트하므로 중첩 된 PropertyExpression을 처리 할 수 ​​있습니다.

당신이 Func<> 받아 ResolveUsing()를 사용해야 매핑 값을 정기적으로 기능을 처리하려면, 그래서 당신은 코드를 직접 입력 할 수 있습니다 및 Expression<Func<>>로 표현 될 수있는 전화를 수정할 필요가 없습니다.

관련 문제