首页 文章

AutoMapper - 将字符串映射到同名对象

提问于
浏览
1

我在两个对象之间进行映射,源包含两个名为 AnimalAnimalColor 的字符串,例如 Animal = "Cat"AnimalColor = "White" . 目标包含一个属性 Animal ,它是一个类型为 Pet 的类,它包含两个字符串, TypeColor

因此,我在mapper配置中有以下内容:

cfg.CreateMap<SrcPetStore, DestPetStore>()
    .ForMember(dest => dest.Animal, opt => opt.MapFrom(src => new Pet() { Type = src.Animal, Color = src.AnimalColor }));

当我运行这个时,我得到 AutoMapperMappingException 抱怨 Missing type map configuration or unsupported mapping 关于映射 String -> Pet

它就像它尝试从源 Animal (字符串)映射目标 Animal (Pet对象)而不考虑自定义ForMember配置

如果我添加一个未使用的映射 cfg.CreateMap<string, Pet>() 一切正常但是它不应该是必要的,因为从不使用该映射(并且没有意义)

这是在AutoMapper 5.0中 .

1 回答

  • 4

    MapFrom() 用于简单地选择源属性进行映射 . 它基本上告诉AutoMapper“我希望您将此属性名称映射到此属性名称,但使用您在配置中的类型映射来映射类型 .

    它被记录为Projection .

    你要做的事情被称为Custom value resolution . 像这样使用 ResolveUsing 方法(只需替换 MapFrom ):

    .ForMember(dest => dest.Animal, opt => opt.ResolveUsing(src => new Pet() { Type = src.Animal, Color = src.AnimalColor }));
    

    ResolveUsing 字面返回函数返回的任何内容并将其分配给目标属性,而不尝试执行任何其他映射 .

    您还可以创建一个 ValueResolver 类并像这样使用它:

    .ForMember(dest => dest.Animal, opt => opt.ResolveUsing<PetResolver>());
    

相关问题