Использование BeforeMap()
для настройки пункта назначения объект опасен. Выполнение вашего кода:
return _mapper.Map<Project, ProjectDto>(projects, opt =>
{
opt.BeforeMap((src, dest) => dest.ProvidedLanguage = requestedLanguage);
});
приведет к NullReferenceException
, так как объект dest
еще не был инициализирован AutoMapper. Смотрите, BeforeMap()
лучше всего работает при выполнении некоторых настроек над исходным объектом, потому что любая работа над целевым объектом может быть переопределена предстоящим процессом отображения. Если вы хотите настроить объект destination , лучше использовать AfterMap()
. Таким образом, у вас уже будет закончен процесс отображения, и вы будете уверены, что ваш целевой объект был инициализирован. Я не говорю, что вы не должны использовать BeforeMap()
, я просто говорю, что будьте осторожны с этим и используйте его, когда вы действительно знаете, что делаете.
Что касается отображения коллекций, то они могут показаться типом object
, но это только то, чем они кажутся. Установите точку останова в отладчике, чтобы убедиться, что их тип правильный.
И вы не сможете установить ProvidedLanguage
свойство на IEnumerable
. Если вы хотите установить это свойство для каждого ProjectDto
, который находится внутри этого IEnumerable
, используйте для этого цикл foreach
:
return _mapper.Map<IEnumerable<Project>, IEnumerable<ProjectDto>>(projects, opt =>
{
opt.AfterMap((source, destination) =>
{
foreach (var dto in destination)
{
dto.ProvidedLanguage = requestedLanguage;
}
});
});