.net 自动Map器表达式必须解析为顶级成员

vjhs03f7  于 2023-01-06  发布在  .NET
关注(0)|答案(6)|浏览(111)

我正在使用自动Map器来Map源对象和目标对象。当我Map它们时,我得到下面的错误。
表达式必须解析为顶级成员。参数名:λ表达式
我无法解决这个问题。
我的源对象和目标对象是:

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

我需要用Destination.OutputData.Cars对象MapSource.Cars,你能帮我一下吗?

rhfm7lfc

rhfm7lfc1#

您正在使用:

Mapper.CreateMap<Source, Destination>()
 .ForMember( dest => dest.OutputData.Cars, 
             input => input.MapFrom(i => i.Cars));

这将不起作用,因为您在dest lambda中使用了2 level。
使用自动Map器,您只能Map到1个级别。要解决此问题,您需要使用单个级别:

Mapper.CreateMap<Source, Destination>()
 .ForMember( dest => dest.OutputData, 
             input => input.MapFrom(i => new OutputData{Cars=i.Cars}));

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

7lrncoxx

7lrncoxx2#

1.定义SourceOutputData之间的Map。

Mapper.CreateMap<Source, OutputData>();

1.更新配置以将Destination.OutputMap到OutputData

Mapper.CreateMap<Source, Destination>().ForMember( dest => dest.Output, input => 
    input.MapFrom(s=>Mapper.Map<Source, OutputData>(s)));
t9eec4r0

t9eec4r03#

你可以这样做:

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

我就是这么做的- )

cigdeys3

cigdeys34#

这对我很有效:

Mapper.CreateMap<Destination, Source>()
    .ForMember(x => x.Cars, x => x.MapFrom(y => y.OutputData.Cars))
    .ReverseMap();
yxyvkwin

yxyvkwin5#

ForPath适用于这种情况。

Mapper.CreateMap<Destination, Source>().ForPath(dst => dst.OutputData.Cars, e => e.MapFrom(src => src.Cars));
pxiryf3j

pxiryf3j6#

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

使用Map器时,请用途:

var destinationObj = Mapper.Map<Source, Destination>(sourceObj)

其中destinationObj是目标的示例,sourceObj是源的示例。
注意:此时您应该尝试停止使用Mapper.CreateMap,它已经过时,很快将不受支持。

相关问题