AutoMapper 将源属性映射到内部目标对象

标签 automapper

我有一个源类:

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/

相关文章:

c# - 我应该如何将我的商业模式与我的观点联系起来?

c# - 将平面 JSON/字典映射到模型(包含子类)

automapper - 使用 LightInject 配置 AutoMapper

c# - AutoMapper Map() 返回错误值

c# - 根据用户未输入的数据验证模型

c# - 将字典列表转换为类列表

c# - AutoMapper MapFrom 用于计算?

c# - xUnit 测试和 .NET Core 2.0 中的 Automapper

c# - 从字符串到 bool 值的奇怪映射行为

.net - AutoMapper AssertConfiguration 在编译时?