Automapper 不会忽略后代的 属性

Automapper doesn't ignore property for descendants

首先,我使用的是 automapper 4.2.1。我有一个 class 代表树视图节点。例如这个 class 有三个属性和一个方法:

class A
{
     public string Name{get; set;}
     public bool IsExpanded{get; set;}
     public ObservableCollection<A> Children {get; set;}

     public void UpdateCurrenNode(A object)
     {
        Mapper.Map(object, this);
     }
}

如您所见,我有一个方法可以帮助我使用给定对象更新当前节点及其后代。但我想忽略 属性 IsExanded。这是我的地图:

CreateMap<A, A>().ForMember(dest => dest.IsExpanded, opts => opts.Ignore());

但在映射后 属性 IsExpanded 仅对根对象被忽略,但对后代对象不会被忽略。我哪里错了?

谢谢!此致,德米特里

请尝试:

CreateMap<A, A>().ForMember(dest => dest.IsExpanded, opts => opts.Ignore())
                 .ForMember(dest => dest.Children, 
                            opt => opt.MapFrom(src => 
                                               src.Children.Select(Mapper.Map<A, A>).ToList()));

例如:

Class一个

public class A
{
    private static MapperConfiguration config = new MapperConfiguration(cfg =>
    {
        cfg.CreateMap<A, A>().ForMember(dest => dest.IsExpanded, opts => opts.Ignore())
                             .ForMember(dest => dest.Children, 
                                        opt => opt.MapFrom(src => src.Children.Select(Mapper.Map<A, A>).ToList()));
    });

    private static IMapper mapper = config.CreateMapper();

    public string Name{get; set;}
    public bool IsExpanded{get; set;}
    public ObservableCollection<A> Children {get; set;}

    public void UpdateCurrenNode(A obj)
    {
       mapper.Map(obj, this);
    }
}

计划

var test1 = new A()
{
    IsExpanded = true,
    Name = "Test1",
    Children = new ObservableCollection<A>()
};

var test2 = new A()
{
    IsExpanded = true,
    Name = "Test2",
    Children = new ObservableCollection<A>()
};

var test3 = new A()
{
    IsExpanded = true,
    Name = "Test3",
    Children = new ObservableCollection<A>()
};

var test = new A()
{
    IsExpanded = true,
    Name = "Test",
    Children = new ObservableCollection<A>() {test1, test2, test3}
};

var clone = new A()
{
    Children = new ObservableCollection<A>()
};

clone.UpdateCurrenNode(test);

产生:


更新

上面的例子也适用于您的原始配置:

cfg.CreateMap<A, A>().ForMember(dest => dest.IsExpanded, opts => opts.Ignore());