可以使用AutoMapper将一个对象映射到对象列表吗? [英] Possible to use AutoMapper to map one object to list of objects?

查看:200
本文介绍了可以使用AutoMapper将一个对象映射到对象列表吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这些是我的课程:

public class EventLog {
        public string SystemId { get; set; }
        public string UserId { get; set; }
        public List<Event> Events { get; set; }
}

public class Event {
        public string EventId { get; set; }
        public string Message { get; set; }
}

public class EventDTO {
        public string SystemId { get; set; }
        public string UserId { get; set; }
        public string EventId { get; set; }
        public string Message { get; set; }
}

基本上,我需要从具有嵌套列表的单个对象转到具有嵌套列表和父对象中的值的对象列表.可以在AutoMapper中完成吗?我意识到,我可以轻松地映射事件"列表并获取EventDTO对象的列表,然后手动设置SystemId和UserId,让AutoMapper为我处理它非常方便.

Basically I need to go from a single object, with a nested list, to a list of objects with values from the nested list and the parent object. Can this be done in AutoMapper? I realize that I can easily map the Events list and get a list of EventDTO objects and then manually set the SystemId and UserId, it would just be very convenient to let AutoMapper handle it for me.

推荐答案

您将需要使用一个自定义转换器来实现这三个映射:

You will need these three mapings with one custom converter:

Mapper.CreateMap<Event, EventDTO>(); // maps message and event id
Mapper.CreateMap<EventLog, EventDTO>(); // maps system id and user id
Mapper.CreateMap<EventLog, IEnumerable<EventDTO>>()
      .ConvertUsing<EventLogConverter>(); // creates collection of dto

因此,您配置了从EventEventDTO以及从EventLogEventDTO的映射,您可以在自定义转换器中同时使用它们:

Thus you configured mappings from Event to EventDTO and from EventLog to EventDTO you can use both of them in custom converter:

class EventLogConverter : ITypeConverter<EventLog, IEnumerable<EventDTO>>
{
    public IEnumerable<EventDTO> Convert(ResolutionContext context)
    {
        EventLog log = (EventLog)context.SourceValue;
        foreach (var dto in log.Events.Select(e => Mapper.Map<EventDTO>(e)))
        {
            Mapper.Map(log, dto); // map system id and user id
            yield return dto;
        }
    }
}

使用 NBuilder 的示例代码:

var log = new EventLog {
    SystemId = "Skynet",
    UserId = "Lazy",
    Events = Builder<Event>.CreateListOfSize(5).Build().ToList()
};

var events = Mapper.Map<IEnumerable<EventDTO>>(log);

这篇关于可以使用AutoMapper将一个对象映射到对象列表吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆