自动映像表达式必须解析为顶级成员

时间:2012-07-24 14:27:06

标签: automapper .net automapper-2

我正在使用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。你能帮帮我吗?

5 个答案:

答案 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)

  1. 定义SourceOutputData之间的映射。

    Mapper.CreateMap<Source, OutputData>();
    
  2. 更新您的配置,将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,它已经过时,很快就会得不到支持。