C# 是否可以使用AutoMapper将一个对象映射到对象列表?

C# 是否可以使用AutoMapper将一个对象映射到对象列表?,c#,automapper,C#,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 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; }
}
公共类事件日志{
公共字符串SystemId{get;set;}
公共字符串用户标识{get;set;}
公共列表事件{get;set;}
}
公开课活动{
公共字符串EventId{get;set;}
公共字符串消息{get;set;}
}
公共类事件{
公共字符串SystemId{get;set;}
公共字符串用户标识{get;set;}
公共字符串EventId{get;set;}
公共字符串消息{get;set;}
}

基本上,我需要从一个具有嵌套列表的单个对象转到一个具有嵌套列表和父对象中的值的对象列表。这可以在AutoMapper中完成吗?我意识到我可以很容易地将事件列表映射到对象,然后手动设置SystemId和UserId,让AutoMapper为我处理它会非常方便

您需要使用一个自定义转换器进行以下三种映射:

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
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;
        }
    }
}
示例代码包含:

var log=新事件日志{
SystemId=“天网”,
UserId=“Lazy”,
Events=Builder.CreateListOfSize(5.Build().ToList())
};
var events=Mapper.Map(日志);

您需要使用一个自定义转换器进行以下三种映射:

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
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;
        }
    }
}
示例代码包含:

var log=新事件日志{
SystemId=“天网”,
UserId=“Lazy”,
Events=Builder.CreateListOfSize(5.Build().ToList())
};
var events=Mapper.Map(日志);

如何在不使用全局Mapper.Map调用的情况下执行foreach?“我有不同的引擎实例。@Beachwalker,给类型转换器实现添加一个构造函数,该构造函数将引擎实例作为参数。”。如果您正在使用诸如AutoFac之类的DI容器,并且已经注册了各种映射引擎,那么只需注册新的转换器,容器就会为您解析新的引擎参数。然而,即使您没有使用DI,构造函数参数也是一个不错的选择。只要在构造新类型转换器的实例时传递参数就行了。虽然这样做有效,但从IEnumerable到IEnumerable的映射却不行,有没有办法解决这个问题?它发布已经六年了,现在我想做一些类似的事情,有没有更好的方法呢?如何在不使用全局Mapper.Map调用的情况下执行foreach?“我有不同的引擎实例。@Beachwalker,给类型转换器实现添加一个构造函数,该构造函数将引擎实例作为参数。”。如果您正在使用诸如AutoFac之类的DI容器,并且已经注册了各种映射引擎,那么只需注册新的转换器,容器就会为您解析新的引擎参数。然而,即使您没有使用DI,构造函数参数也是一个不错的选择。只要在构造新类型转换器的实例时传递参数就行了。虽然这样做有效,但从IEnumerable到IEnumerable的映射不起作用,有办法解决吗?它发布已经六年了,现在我想做一些类似的事情。有没有更好的方法?