AutoMapper高级映射

时间:2019-03-29 21:02:27

标签: c# automapper

我想喜欢将那些if对象合并到Source中。请注意,List<Destination>SourceParent Destination属性必须相同。

Id

课程:

var parent = new SourceParent
{
    Id = 1,
    Childs = new List<SourceChild>
     {
         new SourceChild { ChildId = 12, OtherProperty = "prop1" },
         new SourceChild { ChildId = 13, OtherProperty = "prop2" },
         new SourceChild { ChildId = 14, OtherProperty = "prop3" },
     }
};

Mapper.Initialize(cfb =>
{
    cfb.CreateMap<SourceParent, List<Destination>>()
    .ForMember(dest => dest, opt => opt.MapFrom(src => src.Childs));
    cfb.ValidateInlineMaps = false;
});

List<Destination> destination = Mapper.Map<SourceParent, List<Destination>>(parent);           

是否可以为这种情况创建映射规则?甚至有可能吗?

1 个答案:

答案 0 :(得分:1)

我认为您最好的选择是定义一个TypeConverter

您可以像下面所做的那样内联执行TypeConverters,也可以定义实现ITypeConverter<TIn, TOut>接口的类。

cfb.CreateMap<SourceParent, List<Destination>>().ConvertUsing((src, dest, context) =>
{
    return src.Childs.Select(x => 
    {
        var destination = context.mapper.Map<Destination>(x);
        destination.SourceParentId = src.Id;
        return destination;
    }
});

如果您想这样做(我通常会远离它,因为它会变得难以驾驭),则可以使用元组或类似此类的包装器来定义另一个自定义映射。

cfb.CreateMap<SourceParent, List<Destination>>().ConvertUsing((src, dest, context) =>
{
    return src.Childs.Select(x => context.mapper.Map<Destination>((src.Id, x)))
});

cfb.CreateMap<(int partentId, SourceChild child), Destination>()
.ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.parentId))
.ForMember(dest => dest.ChildId, opt => opt.MapFrom(src => src.child.Id))
.ForMember(dest => dest.OtherProperty , opt => opt.MapFrom(src => src.child.OtherProperty ));

这对于一些小示例可能会很好,但是如果您经常这样做,则可能会导致映射器配置真正混乱(我认为),但是它确实简化了类型转换器。