【问题标题】:AutoMapper map source property into inner destination objectAutoMapper 将源属性映射到内部目标对象
【发布时间】:2018-06-25 16:12:36
【问题描述】:

我有一个源类:

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.Field1Source.Field2Destination.Fields.FieldTwo

此代码不起作用;它会抛出一个错误,说Custom configuration for members is only supported for top-level individ ual members on a type1:

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。
  • @LucianBargaoanu 你能详细说明一下吗?
  • 不是真的,只是搜索以前的答案。

标签: automapper


【解决方案1】:

如 cmets 中所述,为了映射嵌套属性,您需要使用 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)));
});

【讨论】:

    猜你喜欢
    • 2021-02-22
    • 2018-06-18
    • 1970-01-01
    • 2021-04-30
    • 2017-06-19
    • 1970-01-01
    • 1970-01-01
    • 2013-06-13
    • 1970-01-01
    相关资源
    最近更新 更多