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

AutoMapper - mapping strings into object of same name

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

因此我的映射器配置中有以下内容:

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(宠物对象)而不考虑自定义 ForMember 配置

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

这是在 AutoMapper 5.0 中。

MapFrom()用于简单地select源属性进行映射。它基本上是在告诉 AutoMapper“我想让你把这个 属性 name 映射到这个 属性 name,但是映射使用您配置中的类型映射的类型。

记录为Projection

您正在尝试做的事情被称为 Custom value resolution。像这样使用 ResolveUsing 方法(只需替换 MapFrom):

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

ResolveUsing 字面上 returns 无论你的函数 returns 并将其分配给目的地 属性,而不尝试做任何额外的映射。

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

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