4

我需要将一个固定大小的数组映射到多个属性。例如给定这个类:

public class Source
{
    public int[] ItemArray{get;set} // always 4 items
}

我想将数组映射到这个类

public class Dest
{
    public int Item1 { get; set; }
    public int Item2 { get; set; }
    public int Item3 { get; set; }
    public int Item4 { get; set; }
}

有没有一种简单的方法可以使用 AutoMapper 来实现(无需实际映射每个单独的字段)?

4

1 回答 1

6

为 Dest 的属性创建映射:

Mapper.CreateMap<Source, Dest>()
    .ForMember(d => d.Item1, o => o.MapFrom(s => s.ItemArray[0]))
    .ForMember(d => d.Item2, o => o.MapFrom(s => s.ItemArray[1]))
    .ForMember(d => d.Item3, o => o.MapFrom(s => s.ItemArray[2]))
    .ForMember(d => d.Item4, o => o.MapFrom(s => s.ItemArray[3]));

用法:

Source source = new Source() { ItemArray = new int[] { 1, 2, 3, 4 } };
Dest dest = Mapper.Map<Source, Dest>(source);

更新:不,没有简单的方法。AutoMapper 将如何理解,您的属性 Foo 应该映射到源属性 Bar 中索引 N 处的元素?您应该提供所有这些信息。

更新:来自Automapper

投影将源转换为目标,而不是展平对象模型。如果没有额外的配置,AutoMapper 需要一个扁平化的目标来匹配源类型的命名结构。如果要将源值投影到与源结构不完全匹配的目标中,则必须指定自定义成员映射定义。

所以,是的。如果命名结构不匹配,则必须为成员指定自定义映射。

更新:好吧,实际上您可以手动进行所有转换(但我认为这不是更好的方法,特别是如果您有其他可以按名称映射的属性):

Mapper.CreateMap<Source, Dest>().ConstructUsing((s) => new Dest()
{
    Item1 = s.ItemArray[0],
    Item2 = s.ItemArray[1],
    Item3 = s.ItemArray[2],
    Item4 = s.ItemArray[3]
}
于 2012-04-04T14:30:59.777 回答