【问题标题】:Map single source with array property to list of flat destination将具有数组属性的单个源映射到平面目标列表
【发布时间】:2013-10-16 20:29:21
【问题描述】:

我正在使用 .NET 4.5 和 Automapper 3.0

我有一个带有子对象数组作为属性的源对象:

public class Source
{
    public string Name { get; set; }
    public Child[] Values { get; set; }
}

public class Child
{
    public string Val1 { get; set; }
    public string Val2 { get; set; }
}

我的目标对象是扁平的

public class Dest
{
    public string Name { get; set; }
    public string Val1 { get; set; }
    public string Val2 { get; set; }
}

我需要做的是将 Source 的单个实例映射到 Dest 的集合(IList、Dest[],不管是哪种集合)。

也就是说,对于单个 Source 实例,

Name = "MySource"
Dest = [Val1 = "A", Val2 = "B"]
       [Val1 = "C", Val2 = "D"]

我需要返回 Dest 的 2 项集合

Dest[0]: {Name="MySource", Val1="A", Val2="B"}
Dest[1]: {Name="MySource", Val1="C", Val2="D"}

这可以用自动映射器完成吗?

我尝试了以下方法,但都不起作用(显然):

Mapper.CreateMap<Source,Dest>();
var items = Mapper.Map<Source,Dest>();

Mapper.CreateMap<Source,Dest[]>();
var items = Mapper.Map<Source,Dest[]>();

Mapper.Createmap<Source,Dest>();
var items = Mapper.map<Source,Dest[]>();

【问题讨论】:

    标签: c# automapper-3


    【解决方案1】:

    使用ConstructUsing

    Mapper.CreateMap<Source, Dest[]>()
        .ConstructUsing(s => s.Values.Select(c => new Dest 
            { 
                Name = s.Name,
                Val1 = c.Val1,
                Val2 = c.Val2
            }).ToList());
    

    【讨论】:

    • 太好了,谢谢!在这种情况下,没有比仅使用 LINQ 更多的好处吗?
    • 是的——如果你的整个映射是由ConstructUsing 定义的,你就会失去很多通过名称推断字段的好处。但是,如果除了Name 之外还有许多其他字段,您可能会受益于在ConstructUsing 语句中调用Mapper.Map&lt;Source, Dest&gt;()。不过,在这种情况下,这将过于复杂。
    猜你喜欢
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 2010-10-18
    • 2020-05-04
    • 1970-01-01
    • 1970-01-01
    • 2018-04-21
    相关资源
    最近更新 更多