gpt4 book ai didi

c# - 使用 AutoMapper 将成员映射委托(delegate)给子对象

转载 作者:太空宇宙 更新时间:2023-11-03 20:55:29 24 4
gpt4 key购买 nike

我有一个目标类,它结合了源类和该源类的内部类的属性。

class Source {
public int Id {get;set;}
public int UseThisInt {get;set;}
public InnerType Inner {get;set;}
// other properties that the Destination class is not interested in
}
class InnerType {
public int Id {get;set;}
public int Height {get;set;}
// more inner properties
}

我的目标类应该结合 UseThisIntInnerType 的所有属性。

class Destination {
public int Id {get;set;}
public int UseThisInt {get;set;}
public int Height {get;set;}
// more inner properties that should map to InnerType
}

现在我的 AutoMapper 配置如下所示:

CreatMap<Source, Destination>()
.ForMember(d => d.Id, o => o.MapFrom(s => s.Inner.Id))
.ForMember(d => d.Height, o => o.MapFrom(s => s.Inner.Height));

AutoMapper 将在 SourceDestination 之间正确映射 UseThisInt,但我希望能够让它映射所有其他属性没有显式 ForMember 配置的目标,例如 Height

我试过用

Mapper.Initialize(cfg => cfg.CreateMap<Source, Destination>()
.ForMember(d => d.Id, o => o.MapFrom(s => s.Inner.Id))
.ForMember(d => d.UseThisInt, o => o.MapFrom(s => s.UseThisInt))
.ForAllOtherMembers(o => o.MapFrom(source=> source.Inner))
);

,但这并没有达到预期的结果,并且 Destination.Height 保持不变。

最佳答案

AutoMapper 的大多数示例演示了从某个源对象创建新的 Destination 对象,但 AutoMapper 也可用于更新从源对象获取这些属性的现有对象已映射并保留任何剩余属性不变。

因此,可以通过多个步骤从源映射到目标。


因此,如果您像这样从 InnerType 创建映射配置:-

Mapper.Initialize(cfg => {
cfg.CreateMap<Source, Destination>();
cfg.CreateMap<InnerType, Destination>();
});

然后您可以利用此功能通过两次映射到目标对象来叠加映射。

var dest = Mapper.Map<Destination>(src);
Mapper.Map(src.Inner, dest);

这种方法的一个缺点是在使用 Mapper 生成 Destination 对象时需要注意这一点。但是,您可以选择在 AutoMapper 配置中将第二个映射步骤声明为 AfterMap 指令。

Mapper.Initialize(cfg => {
cfg.CreateMap<Source, Destination>()
.AfterMap((src, dest) => Mapper.Map(src.Inner, dest));
cfg.CreateMap<InnerType, Destination>();
});

使用这个更新的配置,您可以通过单个 Map 调用执行映射:-

var dest = Mapper.Map<Destination>(src);

关于c# - 使用 AutoMapper 将成员映射委托(delegate)给子对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50964757/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com