Подтвердить что ты не робот

Выражение Automapper должно быть разрешено для члена верхнего уровня

Я использую 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. Не могли бы вы помочь мне в этом?

4b9b3361

Ответ 1

Вы используете:

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

Это не сработает, потому что вы используете 2 уровня в dest lambda.

С помощью Automapper вы можете отображать только 1 уровень. Чтобы устранить проблему, вам нужно использовать один уровень:

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

Таким образом, вы можете установить свои автомобили в пункт назначения.

Ответ 2

  • Определите отображение между 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))); 
    

Ответ 3

Вы можете сделать это следующим образом:

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

Это мой способ сделать это; -)

Ответ 4

Правильный ответ, заданный allrameest по этому вопросу, должен помочь: AutoMapper - отображение глубокого уровня

Это то, что вам нужно:

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 в этот момент, он устарел и скоро будет не поддерживается.