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; } }
我想在TARGET中设置“Nickname”属性值以匹配SOURCE中的“Nickname”属性值,前提是目标属性“NicknameIsVisible”值已经设置为TRUE,否则我想设置TARGET“Nickname”属性值为空字符串。
我正在尝试这样的东西(不会编译)……
Mapper.CreateMap() .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() .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(preferences, member, account);
这确保首选项对象首先映射到ViewModel ,然后一旦设置了值,就可以进行帐户对象的条件映射。
所以这是我的解决方案,但我无法对自己的答案进行投票!
- c#MSOffice Interop Word不会杀死winword.exe
- 具有Entity Framework 6和PostgreSQL的Mono中不存在列Extent1.Id
- 空白WinForms应用程序中的内存消耗过多
- 如何创建嵌套的GridView来编辑EF Code First关系?
- 我可以选择在运行时关闭JsonIgnore属性吗?
- 我可以使用Moq集成在UnitTests中访问Autofac的全部function吗?
- 如何让RichTextBox看起来平整?
- 我似乎已经陷入了NullReferenceExceptions的巨大麻烦
- C#调整jpg图像,转换为字节并使用varbinary保存到数据库中