我有一个源类:
class Source {
public string Name;
public string Field1;
public string Field2;
}
和两个目标类:
class Destination {
public string Name;
public FieldsDto Fields;
}
class FieldsDto {
public string Field1;
public string FieldTwo;
}
如何将 Source.Field1
映射到 Destination.Fields.Field1
并将 Source.Field2
映射到 Destination.Fields.FieldTwo
?
此代码无效;它会抛出一个错误,说 Custom configuration for members only supported for top-level individ
type1 上的 ual 成员
:
Mapper.Initialize(cfg => {
cfg.CreateMap<Source, Destination>()
.ForMember(dest => dest.Fields.Field1, opt => opt.Mapfrom(src => src.Field1)
.ForMember(dest => dest.Fields.FieldTwo, opt => opt.Mapfrom(src => src.Field2);
});
最佳答案
如评论中所述,为了映射嵌套属性,您需要使用 ForPath
而不是 ForMember
。所以一个完整的配置可能是这样的:
Mapper.Initialize(cfg =>
{
cfg.CreateMap<Source, Destination>()
.ForMember(dest => dest.Name, opt => opt.MapFrom(s => s.Name))
.ForPath(dest => dest.Fields.Field1, opt => opt.MapFrom(src => src.Field1))
.ForPath(dest => dest.Fields.FieldTwo, opt => opt.MapFrom(src => src.Field2));
});
如果您想动态地执行此操作,使用成员名称作为字符串(正如我在聊天中了解到的那样,这看起来像是您想做的事情),那么您将无法轻松使用 ForPath
因为这绝对需要一个仅包含成员表达式的 lambda 表达式。
您可以做的是为嵌套成员访问动态创建一个 lambda 表达式。如果您在这里搜索,我相信您会找到足够多的示例来说明如何创建此类 lambda 表达式。
另一种方法是将映射拆分为不同的类型。因此,您不是直接映射到 Destination
的嵌套属性,而是单独映射嵌套对象。像这样:
Mapper.Initialize(cfg =>
{
cfg.CreateMap<Source, FieldsDto>()
.ForMember("Field1", opt => opt.MapFrom("Field1"))
.ForMember("FieldTwo", opt => opt.MapFrom("Field2"));
cfg.CreateMap<Source, Destination>()
.ForMember(dest => dest.Name, opt => opt.MapFrom(s => s.Name))
.ForMember(dest => dest.Fields, opt => opt.MapFrom(s => Mapper.Map<FieldsDto>(s)));
});
关于AutoMapper 将源属性映射到内部目标对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51027799/