28

我正在使用自动映射器来映射源对象和目标对象。当我映射它们时,我得到以下错误。

表达式必须解析为顶级成员。参数名称: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.CarsDestination.OutputData.Cars对象映射。你能帮我解决这个问题吗?

4

5 回答 5

42

您正在使用 :

 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})); 

这样,您可以将汽车设置到目的地。

于 2012-10-17T17:25:03.700 回答
16
  1. 定义 和 之间Source的映射OutputData

    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))); 
    
于 2012-07-25T10:31:49.073 回答
14

你可以这样做:

// 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)); 

这就是我这样做的方式;-)

于 2015-06-30T11:16:28.420 回答
1

这对我有用:

Mapper.CreateMap<Destination, Source>()
    .ForMember(x => x.Cars, x => x.MapFrom(y => y.OutputData.Cars))
    .ReverseMap();
于 2020-01-14T20:35:42.213 回答
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,它已过时并且很快将不受支持。

于 2016-08-05T12:55:43.287 回答