我想喜欢将那些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);
是否可以为这种情况创建映射规则?甚至有可能吗?
答案 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 ));
这对于一些小示例可能会很好,但是如果您经常这样做,则可能会导致映射器配置真正混乱(我认为),但是它确实简化了类型转换器。