可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I am trying to map objects with multi-level members: these are the classes:
public class Father { public int Id { get; set; } public Son Son { get; set; } } public class FatherModel { public int Id { get; set; } public int SonId { get; set; } } public class Son { public int Id { get; set; } }
This is how I try automap it:
AutoMapper.Mapper.CreateMap<FatherModel , Father>() .ForMember(dest => dest.Son.Id, opt => opt.MapFrom(src => src.SonId));
this is the exception that I get:
Expression 'dest => Convert(dest.Son.Id)' must resolve to top-level member and not any child object's properties. Use a custom resolver on the child type or the AfterMap option instead. Parameter name: lambdaExpression
Thanks
回答1:
This will work both for mapping to a new or to an existing object.
Mapper.CreateMap<FatherModel, Father>() .ForMember(x => x.Son, opt => opt.MapFrom(model => model)); Mapper.CreateMap<FatherModel, Son>() .ForMember(x => x.Id, opt => opt.MapFrom(model => model.SonId));
回答2:
AutoMapper.Mapper.CreateMap<FatherModel, Father>() .ForMember(x => x.Son, opt => opt.ResolveUsing(model => new Son() {Id = model.SonId}));
if it's getting more complex you can write a ValueResolver class, see example here- http://automapper.codeplex.com/wikipage?title=Custom%20Value%20Resolvers
回答3:
duplicate from:https://stackoverflow.com/a/8944694/1586498
Mapper.CreateMap<DomainClass, Child>(); Mapper.CreateMap<DomainClass, Parent>() .ForMember(d => d.Id, opt => opt.MapFrom(s => s.Id)) .ForMember(d => d.A, opt => opt.MapFrom(s => s.A)) .ForMember(d => d.Child, opt => opt.MapFrom(s => Mapper.Map<DomainClass, Child>(s)));
Thanks to: @justin-niessner