请任何人建议如何在AutoMapper中使用条件映射来根据现有的TARGET属性值从SOURCE对象映射TARGET对象中的值?
所以我的源类是:
public class UserDetails
{
public String Nickname { get; set; }
}
我的目标类是:
public class ProfileViewModel
{
public Boolean NicknameIsVisible { get; set;
public String Nickname { get; set; }
}
我想设置"昵称" TARGET中的属性值与"昵称"相匹配SOURCE中的属性值仅在目标属性" NicknameIsVisible" value已经设置为TRUE,否则我想设置TARGET"昵称"属性值为空字符串。
我正在尝试这样的事情(不会编译)......
Mapper.CreateMap<UserDetails, ProfileViewModel>()
.ForMember(
destination => destination.Nickname,
option => option.
.MapFrom(
source => source.NicknameIsVisible ?
source.Nickname :
String.Empty)
);
但&#34; NicknameIsVisible&#34;不是我的SOURCE的属性,而是我的目标的属性。
BTW,我的ProfileViewModel使用Owain Wragg的方法(http://consultingblogs.emc.com/owainwragg/archive/2010/12/22/automapper-mapping-from-multiple-objects.aspx)绑定到三个实体,它是另一个为&#34; NicknameIsVisible&#34;提供值的实体。属性。
请问任何人都可以建议使用正确的语法来解决这个问题吗?
答案 0 :(得分:15)
试试这个:
Mapper.CreateMap<UserDetails, ProfileViewModel>()
.ForMember(
destination => destination.Nickname,
option =>
{
option.Condition(rc =>
{
var profileViewModel = (ProfileViewModel)rc.InstanceCache.First().Value;
return profileViewModel.NicknameIsVisible;
});
option.MapFrom(source => source.Nickname);
}
);
答案 1 :(得分:2)
使用devduder的例子我现在有以下代码编译:
.ForMember(
destination => destination.Nickname,
option =>
{
option.Condition(resolutionContext =>
(resolutionContext.InstanceCache.First().Value as ProfileViewModel).NicknameIsVisible);
option.MapFrom(source => source.Nickname);
}
);
然而,尽管它编译并运行,但它并没有填充destination.Nickname。
编辑:我必须更改映射的顺序,以便首先映射首选项对象(具有&#34; NicknameIsVisible&#34;属性的值),以便值可用于测试!)
所以对我的三向映射的调用是:
var profileViewModel = EntityMapper.Map<ProfileViewModel>(preferences, member, account);
这确保首选项对象首先映射到 ViewModel ,然后帐户对象的条件映射可能会发生价值已经确定。
所以这是我的解决方案,但我无法对自己的答案进行投票!