2012-07-26 21 views
0

我需要:AutoMapper:如何做簡單平整

// SOURCE 
class A { 
    public B B; 
    public C C; 
} 

class B { public int X; } 
class C { public int Y; } 

// DESTINATION 
class D { 
    public int X; 
    public int Y; 
} 

// I want to configure following operation 
// without mapping each (X and Y) fields explicitly. 
D.X = A.B.X; 
D.Y = A.C.Y; 


// here is the essence of what I am trying to accomplish. 
Mapper.CreateMap<B, D>(); 
Mapper.CreateMap<C, D>(); 
var map = Mapper.CreateMap<A, D>(); 
map.ForMember(dst => dst, opt => opt.MapFrom(src => src.B)); 
map.ForMember(dst => dst, opt => opt.MapFrom(src => src.C)); 

有什麼建議?

注意:我知道,如果我將D.X轉換爲D.BX和D.Y轉換爲D.CY,它將起作用。我想在不添加D的屬性的前提下完成此操作。我也可以通過使用Map的「填充」版本來實現這一點。

回答

0
// I want to configure following operation 
// without mapping each (X and Y) fields explicitly. 
D.X = A.B.X; 
D.Y = A.B.Y; 

根據你的班級,B沒有Y.B有X.你的意思是D.Y = A.C.Y?如果是這樣的話:

Mapper.CreateMap<A, D>() 
    .ForMember(d => d.X, o => o.MapFrom(s => s.B.X)) 
    .ForMember(d => d.Y, o => o.MapFrom(s => s.C.Y)) 
; 
+1

是的,那樣做。我有很多領域,我不想明確地映射它們。我確實說過'沒有在問題中明確地映射每個(X和Y)字段「。 – 2012-07-27 02:53:53

+0

是的,我的意思是A.C.Y,而不是A.B.Y.謝謝你指出。 – 2012-07-27 02:54:40

+0

你的確說過,出於某種原因,我認爲你的意思是沒有'CreateMap '和'CreateMap '行(這不應該是扁平化所必需的)。在我看來,你已經知道我會提供相同的選項,要麼重命名D中的屬性,要麼使用ForMember顯式映射每個屬性。我想不出有任何其他的辦法,所以如果你願意,我會很樂意刪除我的答案,只是讓我知道。 – danludwig 2012-07-27 11:18:23