使用AutoMapper将Dictionary映射到List并存储它的密钥

时间:2015-04-21 13:58:44

标签: automapper automapping

我有一个对象,我们称之为Sprite,其Dictionary<string, SpriteMapImageWrapper>名为SpriteImages。密钥是一个字符串,需要存储&#39;在映射的对象中。此词典需要映射到平面List<SpriteMapImageInfo>。所有其他属性都相同,但字典键需要映射到SpriteMapImageInfo.Key。这可以使用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; }
}

2 个答案:

答案 0 :(得分: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 
                        }
               );
           }
       }
     );

答案 1 :(得分: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使用SpriteMapImageInfoKeyValuePair<string, SpriteMapImageWrapper>的映射定义从SpriteImageWrapper构建SpriteMapImageInfo

接下来,我们使用.AfterMap分配Key属性。

最后,我们告诉AutoMapper忽略目标类型的所有属性,因为我们已经使用ConstructUsing处理了这些属性。