AutoMapper -将字符串映射到同名对象
本文关键字:对象 映射 字符串 AutoMapper | 更新日期: 2023-09-27 17:53:55
我在两个对象之间进行映射,源包含两个字符串,称为Animal
和AnimalColor
,例如Animal = "Cat"
和AnimalColor = "White"
。目的地包含一个属性Animal
,它是一个类型为Pet
的类,包含两个字符串,Type
和Color
因此,在我的映射器配置中有以下内容:
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>()
一切工作,但它不应该是必要的,因为映射是从未使用(和没有意义)
MapFrom()
用于简单地选择源属性进行映射。它基本上是在告诉AutoMapper "我想让你把这个属性name映射到这个属性name,但是使用你在配置中的类型映射来映射类型。
文档名称为投影。
您正在尝试做的事情被称为自定义值解析。像这样使用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>());