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

时间:2016-07-01 09:33:09

标签: c# .net automapper

我在两个对象之间进行映射,源包含两个名为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 个答案:

答案 0 :(得分:5)

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

记录为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>());