C#AutoMapper基于目标值的条件映射

Dib*_*Dib 12 c# mapping conditional automapper

请问任何人都可以建议如何在AutoMapper中使用条件映射来根据现有的TARGET属性值从SOURCE对象映射TARGET对象中的值?

所以我的源类是:

public class UserDetails
{
    public String Nickname { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我的目标类是:

public class ProfileViewModel
{
    public Boolean NicknameIsVisible { get; set;
    public String Nickname { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我想在TARGET中设置"Nickname"属性值以匹配SOURCE中的"Nickname"属性值,前提是目标属性"NicknameIsVisible"值已经设置为TRUE,否则我想设置TARGET"Nickname"属性值为空字符串.

我正在尝试这样的东西(不会编译)......

Mapper.CreateMap<UserDetails, ProfileViewModel>()
.ForMember(
            destination => destination.Nickname,
            option => option.
                .MapFrom(
                    source => source.NicknameIsVisible ? 
                    source.Nickname :
                    String.Empty)
);
Run Code Online (Sandbox Code Playgroud)

但是"NicknameIsVisible"不是我的SOURCE的属性,而是我的TARGET的属性.

顺便说一下,我的ProfileViewModel使用Owain Wragg的方法(http://consultingblogs.emc.com/owainwragg/archive/2010/12/22/automapper-mapping-from-multiple-objects.aspx)绑定到三个实体,它是另一个将值赋给"NicknameIsVisible"属性的实体.

任何人都可以建议使用正确的语法来解决这个问题吗?

dev*_*der 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);
        }
);
Run Code Online (Sandbox Code Playgroud)


Dib*_*Dib 6

使用 devduder 的示例,我现在可以编译以下代码:

.ForMember(
    destination => destination.Nickname,
    option => 
    {
        option.Condition(resolutionContext =>
            (resolutionContext.InstanceCache.First().Value as ProfileViewModel).NicknameIsVisible);
        option.MapFrom(source => source.Nickname);
    }
);
Run Code Online (Sandbox Code Playgroud)

然而,尽管它编译并运行,但它并没有用任何东西填充destination.Nickname。

编辑:我必须更改映射的顺序,以便首先映射首选项对象(其中具有“NicknameIsVisible”属性的值,以便该值可用于测试!)

所以对我的三向映射的调用是:

var profileViewModel = EntityMapper.Map<ProfileViewModel>(preferences, member, account);
Run Code Online (Sandbox Code Playgroud)

这确保了首选项对象首先映射到ViewModel ,然后一旦设置了值,就可以发生帐户对象的条件映射。

所以这是我的解决方案,但我不能投票赞成我自己的答案!