2012-07-26 46 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