![](/img/trans.png)
[英]AutoMapper: Mapping between the two collections with 'Ignore'
[英]How to use BeforeMap Action when mapping two Collections with Automapper?
使用 automapper 映射两个单个对象时, BeforeMap
操作工作正常:
return _mapper.Map<Project, ProjectDto>(projects, opt =>
{
opt.BeforeMap((src, dest) => dest.ProvidedLanguage = requestedLanguage);
});
但是当映射两个集合时, BeforeMap
不起作用,因为src
和dest
现在是object
类型:
return _mapper.Map<IEnumerable<Project>, IEnumerable<ProjectDto>>(projects, opt =>
{
opt.BeforeMap((src, dest) => dest.ProvidedLanguage = requestedLanguage);
});
我需要为映射本身提供语言,所以我无法在映射后设置它。 映射两个集合时,如何将提供的语言传递给目标对象?
我初步是这样解决的:
var result = new List<ProjectDto>();
foreach (var item in projects)
{
var dest = new ProjectDto() { ProvidedLanguage = requestedLanguage };
result.Add(_mapper.Map(item, dest));
}
我知道,它看起来并不优雅。 如果有人知道更好的解决方法,请不要犹豫,分享您的想法。
使用BeforeMap()
来调整目标对象是危险的。 运行你的代码:
return _mapper.Map<Project, ProjectDto>(projects, opt =>
{
opt.BeforeMap((src, dest) => dest.ProvidedLanguage = requestedLanguage);
});
将导致NullReferenceException
因为dest
对象尚未被 AutoMapper 初始化。 看, BeforeMap()
最适合对源对象执行一些调整,因为对目标对象的任何工作都可以被即将到来的映射过程覆盖。 如果您想对目标对象进行调整,最好使用AfterMap()
。 这样,您的映射过程就已经结束,并且您的目标对象已被初始化。 我并不是说你不应该使用BeforeMap()
,我只是说要谨慎使用它,并在你真正知道自己在做什么时使用它。
至于映射集合,它们似乎是object
类型,但这正是它们的样子。 在调试器中放置一个断点以查看它们的类型是否正确。
而且您将无法在IEnumerable
上设置ProvidedLanguage
属性。 如果要在IEnumerable
内的每个ProjectDto
上设置该属性,请为此使用foreach
循环:
return _mapper.Map<IEnumerable<Project>, IEnumerable<ProjectDto>>(projects, opt =>
{
opt.AfterMap((source, destination) =>
{
foreach (var dto in destination)
{
dto.ProvidedLanguage = requestedLanguage;
}
});
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.