我正在使用automapper来映射源和目标对象。当我映射它们时,我得到以下错误。
表达式必须解析为顶级成员。参数名称:lambdaExpression
我无法解决问题。
我的源和目标对象是:
public partial class Source
{
private Car[] cars;
public Car[] Cars
{
get { return this.cars; }
set { this.cars = value; }
}
}
public partial class Destination
{
private OutputData output;
public OutputData Output
{
get { return this.output; }
set { this.output= value; }
}
}
public class OutputData
{
private List<Cars> cars;
public Car[] Cars
{
get { return this.cars; }
set { this.cars = value; }
}
}
我必须使用Source.Cars
对象映射Destination.OutputData.Cars
。你能帮帮我吗?
答案 0 :(得分:29)
您正在使用:
Mapper.CreateMap<Source, Destination>()
.ForMember( dest => dest.OutputData.Cars,
input => input.MapFrom(i => i.Cars));
这不起作用,因为你在dest lambda中使用了2级。
使用Automapper,您只能映射到1级。要解决此问题,您需要使用单个级别:
Mapper.CreateMap<Source, Destination>()
.ForMember( dest => dest.OutputData,
input => input.MapFrom(i => new OutputData{Cars=i.Cars}));
这样,您可以将汽车设置为目的地。
答案 1 :(得分:16)
定义Source
和OutputData
之间的映射。
Mapper.CreateMap<Source, OutputData>();
更新您的配置,将Destination.Output
映射到OutputData
。
Mapper.CreateMap<Source, Destination>().ForMember( dest => dest.Output, input =>
input.MapFrom(s=>Mapper.Map<Source, OutputData>(s)));
答案 2 :(得分:6)
你可以这样做:
// First: create mapping for the subtypes
Mapper.CreateMap<Source, OutputData>();
// Then: create the main mapping
Mapper.CreateMap<Source, Destination>().
// chose the destination-property and map the source itself
ForMember(dest => dest.Output, x => x.MapFrom(src => src));
这是我的方法; - )
答案 3 :(得分:1)
这对我有用:
Mapper.CreateMap<Destination, Source>()
.ForMember(x => x.Cars, x => x.MapFrom(y => y.OutputData.Cars))
.ReverseMap();
答案 4 :(得分:0)
allrameest对此问题给出的正确答案应该有所帮助:AutoMapper - Deep level mapping
这就是你需要的:
Mapper.CreateMap<Source, Destination>()
.ForMember(dest => dest.OutputData, opt => opt.MapFrom(i => i));
Mapper.CreateMap<Source, OutputData>()
.ForMember(dest => dest.Cars, opt => opt.MapFrom(i => i.Cars));
使用映射器时,请使用:
var destinationObj = Mapper.Map<Source, Destination>(sourceObj)
其中destinationObj是Destination的实例,sourceObj是Source的实例。
注意:此时你应该尝试不再使用Mapper.CreateMap,它已经过时,很快就会得不到支持。