2015-04-21 33 views
2

我有一个对象,我们称之为Sprite,它有一个叫做SpriteImagesDictionary<string, SpriteMapImageWrapper>。关键是一个字符串,它需要被存储在映射的对象中。这本词典需要映射到一个单位List<SpriteMapImageInfo>。所有其他属性都是相同的,但字典密钥需要映射到SpriteMapImageInfo.Key。这可能使用AutoMapper?使用AutoMapper将字典映射到列表并存储它的密钥

public class SpriteMapImageWrapper 
{ 
    public int X { get; set; } 
    public int Y { get; set; } 
    public int Width { get; set; } 
    public int Height { get; set; } 
} 
public class SpriteMapImageInfo 
{ 
    public string Key { get; set; } 
    public int X { get; set; } 
    public int Y { get; set; } 
    public int Width { get; set; } 
    public int Height { get; set; } 
} 

回答

0

给它使用.Aftermap,一出手就像这里:

Mapper.CreateMap<Sprite, List<SpriteMapImageInfo>>() 
     .AfterMap((u, t) => 
     { 
      foreach(var s in u.SpriteImages) 
      { 
       t.Add(new SpriteMapImageInfo 
         { 
          Key = s.Key, 
          Height = s.Value.Height, 
          Width = s.Value.Width, 
          X = s.Value.X, 
          Y = s.Value.Y 
         } 
       ); 
      } 
     } 
    ); 
0

这里的另一种方式,利用ConstructUsingAfterMap

// Create an "inner" mapping 
Mapper.CreateMap<SpriteMapImageWrapper, SpriteMapImageInfo>() 
    .ForMember(dest => dest.Key, opt => opt.Ignore()); 

// Create an "outer" mapping that uses the "inner" mapping 
Mapper.CreateMap<KeyValuePair<string, SpriteMapImageWrapper>, SpriteMapImageInfo>() 
    .ConstructUsing(kvp => Mapper.Map<SpriteMapImageInfo>(kvp.Value)) 
    .AfterMap((src, dest) => dest.Key = src.Key) 
    .ForAllMembers(opt => opt.Ignore()); 

随着我们告诉AutoMapper第二映射使用SpriteImageWrapper到01的映射定义从KeyValuePair<string, SpriteMapImageWrapper>构造。

接下来,我们使用.AfterMap来指定Key属性。

最后,我们告诉AutoMapper忽略目标类型的所有属性,因为我们已经用ConstructUsing来照顾它们。

相关问题