Выражение 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
. Не могли бы вы помочь мне в этом?
Ответы
Ответ 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 в этот момент, он устарел и скоро будет не поддерживается.