【发布时间】:2015-09-19 00:20:39
【问题描述】:
我有一个具有以下定义的递归模型类:
public class ItemFilterBlockGroup
{
public ItemFilterBlockGroup(string groupName, ItemFilterBlockGroup parent, bool advanced = false)
{
GroupName = groupName;
ParentGroup = parent;
Advanced = advanced;
ChildGroups = new List<ItemFilterBlockGroup>();
}
public string GroupName { get; private set; }
public bool Advanced { get; private set; }
public ItemFilterBlockGroup ParentGroup { get; private set; }
public List<ItemFilterBlockGroup> ChildGroups { get; private set; }
}
它有一个名为 ChildGroups 的属性,它是一个自身的列表 - 用于构建分层模型。我要做的是将此模型映射到视图模型,但有条件。有时(取决于 UI 设置)我只想包含 Advanced = false 的子对象,有时我想包含所有模型。
目前,我正在通过涉及 Mapper.Reset() 和运行时重新定义地图的令人讨厌的 hack 来实现这一点 - 这显然不好并且存在多个问题:
Mapper.Reset();
if (showAdvanced)
{
Mapper.CreateMap<ItemFilterBlockGroup, ItemFilterBlockGroupViewModel>();
}
else
{
Mapper.CreateMap<ItemFilterBlockGroup, ItemFilterBlockGroupViewModel>()
.ForMember(dest => dest.ChildGroups,
opts => opts.MapFrom(from => from.ChildGroups.Where(c => c.Advanced == false)));
}
var mappedViewModels = Mapper.Map<ObservableCollection<ItemFilterBlockGroupViewModel>>(blockGroups);
给定模型的输入层次结构示例:
Root (Advanced = False)
+-Child 1 (Advanced = True)
+-Child 2 (Advanced = False)
+-Child 3 (Advanced = False)
+-Child 3 Sub Child 1 (Advanced = False)
+-Child 3 Sub Child 2 (Advanced = True)
第一个 CreateMap 定义返回此层次结构不变,而第二个 CreateMap 定义(使用 Advanced 参数)返回此修改后的层次结构(所有 Advanced = true 模型及其子模型都被排除在映射之外):
Root (Advanced = False)
+-Child 2 (Advanced = False)
+-Child 3 (Advanced = False)
+-Child 3 Sub Child 1 (Advanced = False)
如何参数化 showAdvanced 条件并使用单个 CreateMap 定义实现相同的结果?我已经搜索了很多正确的解决方案,尝试了 ResolveUsing、CustomResolvers,但无济于事。
【问题讨论】:
标签: c# automapper