Automapper-根据数组计数将具有数组属性的单个对象映射到N个对象

时间:2019-02-26 19:06:11

标签: c# automapper

我正在尝试将包含数组的对象映射到没有数组的对象列表中。例如:

假设我有这个对象:

public class SourceInformation {
    public decimal Id { get; set; }
    public Person[] People { get; set; }
    ...
}

人员班:

public class Person {
    public string First { get; set; }
    public string Last { get; set; }
    public string Middle { get; set; }
}

我想映射到该对象:

public class Destination {
    public decimal Id { get; set; }
    public string Name { get; set; }
    ...
}

但是我想要的是,如果我的Person属性中有N个People对象,则在映射Destination时我希望有N个<SourceInformation, Destination>对象作为回报

每个Destination对象应该具有相关的名称信息,但是它们都具有相同的Id属性。

如何告诉Automapper 1个SourceInformation对象映射到N个目标对象?

1 个答案:

答案 0 :(得分:0)

弄清楚了。我最终创建了一个自定义的Converter和Profile。

个人资料:

public class MapperProfile : Profile {
    public MapperProfile() {
        CreateMap<SourceInformation, Destination>().ForMember(....);
        CreateMap<SourceInformation, IEnumerable<Destination>>().ConvertUsing<CustomConverter>();
    }
}

转换器:

public class CustomConverter : ITypeConverter<SourceInformation, IEnumerable<Destination>> {
    public IEnumerable<Destination> Convert(SourceInformation source, IEnumerable<Destination> destination, ResolutionContext context) {
        var destinations = new List<Destination>();
        foreach (var person in source.People) {
            var destination = context.Mapper.Map<Destination>(source);
            destination.Name = NameUtilStatic.FormatName(person.Name);
            destinations.Add(destination);
        }
        return destinations;
    }
}

然后只需调用映射器(我使用的是DI注入映射器),就像说_mapper.Map<SourceInformation, IEnumerable<Destination>>(source);

一样简单

您必须先加载个人资料。类似于:Mapper.Initialize(cfg => { cfg.AddProfile<MapperProfile>(); });

可以在此处找到更多示例:https://docs.automapper.org/en/stable/Configuration.html