基于目标值的C#AutoMapper条件映射
请任何人建议如何使用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; }
}
我只想在目标属性“NicknameIsVisible”值已设置为TRUE的情况下,在目标中设置“昵称”属性值以匹配SOURCE中的“昵称”属性值,否则,我想设置TARGET“昵称”属性值赋给一个空字符串。
我正在尝试这样的事情(不会编译)...
Mapper.CreateMap<UserDetails, ProfileViewModel>()
.ForMember(
destination => destination.Nickname,
option => option.
.MapFrom(
source => source.NicknameIsVisible ?
source.Nickname :
String.Empty)
);
但是“NicknameIsVisible”不是我的SOURCE的属性,而是我的TARGET的属性。
顺便说一下,我的ProfileViewModel绑定到三个实体使用Owain Wragg的方法(http://consultingblogs.emc.com/owainwragg/archive/2010/12/22/automapper-mapping-from-multiple-objects.aspx),它是另一个实体为“NicknameIsVisible”属性赋值。
请任何人都可以建议使用正确的语法来解决这个问题?
尝试这个:
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);
}
);
使用devduder的例子,我现在有以下编译的代码:
.ForMember(
destination => destination.Nickname,
option =>
{
option.Condition(resolutionContext =>
(resolutionContext.InstanceCache.First().Value as ProfileViewModel).NicknameIsVisible);
option.MapFrom(source => source.Nickname);
}
);
然而,尽管它编译并运行,但它并没有用任何东西填充destination.nickname。
编辑:我不得不改变我的映射的顺序,所以偏好对象(它具有“NicknameIsVisible”属性的值首先被映射,因此值可用于测试!)
所以对我的三维制图的呼吁是:
var profileViewModel = EntityMapper.Map<ProfileViewModel>(preferences, member, account);
这确保首选项对象首先映射到ViewModel ,然后一旦设置了值,就可以发生帐户对象的条件映射。
所以这是我的解决方案,但我不能对自己的答案投票!
链接地址: http://www.djcxy.com/p/37425.html上一篇: C# AutoMapper Conditional Mapping based upon target value
下一篇: Automapper instantiates destination object instead of mapping recursively