Automapper 不映射空源
Automapper don't map null sources
我正在使用 Automapper,我需要将对象列表映射到嵌套对象中。我有这些对象:
public abstract class FooSrcBase
{
}
public class FooSrc : FooSrcBase
{
public bool Prop { get; set; }
}
public class FooDest
{
public bool Prop { get; set; }
}
public class FooDestGroup
{
public FooDest FooDest { get; set; }
}
public class Dest
{
public FooDestGroup FooDestGroup { get; set; }
}
我有 IEnumerable<FooSrc>
,其中包含 FooSrc
个对象(有很多实现,源中每种类型可能只存在一个对象),我需要将其映射到 Dest
目的。我需要这个因为映射到前端的视图模型。
当我这样注册映射时:
CreateMap<IEnumerable<FooSrc>, Dest>().ForPath(dest => dest.FooDestGroup.FooDest, opt => opt.MapFrom(src => src.FirstOrDefault(x => x.GetType() == typeof(FooSrc))));
CreateMap<FooSrc, FooDest>();
当我映射空列表时,Dest
对象出现问题 - FooDestGroup
是一个对象实例,它有一个 属性 FooDest
和 null
值。
如果我提供空列表作为源,如何使 Dest
属性 FooDestGroup
映射到 null
?
首先,您的摘要 FooSrc
class 需要一个不同的名称(与您的具体 class 名称冲突 FooSrc
)
如何修改 Dest 的构造函数来避免嵌套问题?
Automapper 能够自动映射到构造函数参数,但如果您需要更高级的行为,您可以参考 https://docs.automapper.org/en/stable/Construction.html
像这样的东西应该可以工作:
public class Dest
{
public FooGroup FooGroup { get; set; }
public Dest(FooDest fooDest)
{
FooGroup = new FooGroup { FooDest = fooDest };
}
}
[..]
Mapper.CreateMap<FooSrc, Dest>();
Mapper.Map<List<Dest>>(listOfFooSrc);
这解决了我的问题:
CreateMap<IEnumerable<FooSrcBase>, Dest>()
.ForMember(dest => dest.FooDestGroup, opt => opt.MapFrom(src => src.FirstOrDefault(x => x.GetType() == typeof(FooSrc))));
CreateMap<FooSrc, FooDestGroup>()
.ForMember(dest => dest.FooDest, opt => opt.MapFrom(src => src));
CreateMap<FooSrc, FooDest>();
我正在使用 Automapper,我需要将对象列表映射到嵌套对象中。我有这些对象:
public abstract class FooSrcBase
{
}
public class FooSrc : FooSrcBase
{
public bool Prop { get; set; }
}
public class FooDest
{
public bool Prop { get; set; }
}
public class FooDestGroup
{
public FooDest FooDest { get; set; }
}
public class Dest
{
public FooDestGroup FooDestGroup { get; set; }
}
我有 IEnumerable<FooSrc>
,其中包含 FooSrc
个对象(有很多实现,源中每种类型可能只存在一个对象),我需要将其映射到 Dest
目的。我需要这个因为映射到前端的视图模型。
当我这样注册映射时:
CreateMap<IEnumerable<FooSrc>, Dest>().ForPath(dest => dest.FooDestGroup.FooDest, opt => opt.MapFrom(src => src.FirstOrDefault(x => x.GetType() == typeof(FooSrc))));
CreateMap<FooSrc, FooDest>();
当我映射空列表时,Dest
对象出现问题 - FooDestGroup
是一个对象实例,它有一个 属性 FooDest
和 null
值。
如果我提供空列表作为源,如何使 Dest
属性 FooDestGroup
映射到 null
?
首先,您的摘要 FooSrc
class 需要一个不同的名称(与您的具体 class 名称冲突 FooSrc
)
如何修改 Dest 的构造函数来避免嵌套问题? Automapper 能够自动映射到构造函数参数,但如果您需要更高级的行为,您可以参考 https://docs.automapper.org/en/stable/Construction.html
像这样的东西应该可以工作:
public class Dest
{
public FooGroup FooGroup { get; set; }
public Dest(FooDest fooDest)
{
FooGroup = new FooGroup { FooDest = fooDest };
}
}
[..]
Mapper.CreateMap<FooSrc, Dest>();
Mapper.Map<List<Dest>>(listOfFooSrc);
这解决了我的问题:
CreateMap<IEnumerable<FooSrcBase>, Dest>()
.ForMember(dest => dest.FooDestGroup, opt => opt.MapFrom(src => src.FirstOrDefault(x => x.GetType() == typeof(FooSrc))));
CreateMap<FooSrc, FooDestGroup>()
.ForMember(dest => dest.FooDest, opt => opt.MapFrom(src => src));
CreateMap<FooSrc, FooDest>();