2013-10-26 3 views
0
class SomeObject 
{ 
    public string name {get;set;} 
} 

class CustomCollection : List<SomeObject> 
{ 
    public int x {get;set;} 
    public string z {get;set;} 
} 

class A 
{ 
    public CustomCollection collection { get ; set; } 
} 

class B 
{ 
    public CustomCollection collection { get ; set; } 
} 


// Creating mapping 
Mapper.CreateMap<A, B>(); 

A를 B에 매핑하면 CustomCollection에서 X 및 Z를 제외한 모든 속성이 올바르게 매핑됩니다.AutoMapper에는 사용자 지정 목록의 모든 속성이 포함됩니다. <T>

CustomCollection은 올바르게 초기화 된 SomeObject List를 가져오고 SomeObject.Name도 올바르게 매핑됩니다.

컬렉션에서 선언 한 사용자 지정 속성 X, Z 만 매핑되지 않습니다.

내가 뭘 잘못하고 있니?

필자가 찾은 유일한 방법은 아래의 매핑을 수행하는 것입니다.하지만 automapper를 사용하는 목적을 다소 상쇄하고 CustomCollection에 새 속성을 추가 할 때마다 중단됩니다.

Mapper.CreateMap<A, B>().AfterMap((source, destination) => { 
    source.x = destination.x; 
    source.z = destination.z ; 
}); 

답변

0

현재 매핑 구성은 새로운 CustomCollection는하지만 SomeObject 항목 내부 소스 컬렉션의 개체에 대한 참조 생성한다.

CreateMap<CustomCollection, CustomCollection>() 
    .ConstructUsing(col => col); 

CreateMap<A, B>(); 

AutoMapper 위해 설계되지 않은 : 당신의 b.collection는 다음과 같은 매핑 구성을 사용할 수 a.collection에 참조로도 좋은 경우

CreateMap<CustomCollection, CustomCollection>() 
    .AfterMap((source, dest) => dest.AddRange(source)); 

CreateMap<A, B>(); 

: 그 문제가 아니라면 다음과 같은 매핑 구성을 사용할 수 있습니다 복제가 필요하다면 자신의 논리를 써야합니다.

+0

SomeObject가 초기화되지 않았거나 참조이지만 내 CustomCollection.x 및 CustomCollection.y가 매핑되지 않으면 내 이슈가 아니라 각각 0과 null로 남아 있습니다. – newbie

+0

@newbie 내 대답을 시도해 봤어? –