2012-02-01 50 views
3

Im被AutoMapper语法卡住了。Automapper Map嵌套类中的成员

如何跳过嵌套类中的映射成员(通过条件字符串为空)? 林尝试下面的代码:

[TestMethod] 
public void TestMethod4() 
{ 
    var a = new A { Nested = new NestedA { V = 1, S = "A" } }; 
    var b = new B { Nested = new NestedB { V = 2, S = string.Empty } }; 

    Mapper.CreateMap<B, A>(); 
    Mapper.CreateMap<NestedB, NestedA>().ForMember(s => s.S, opt => opt.Condition(src => !string.IsNullOrWhiteSpace(src.S))); 
    var result = Mapper.Map(b, a); 

     Assert.AreEqual(2, result.Nested.V);  // OK 
     Assert.AreEqual("A", result.Nested.S);  // FAIL: S == null 
} 

感谢

回答

2

您是否尝试过使用opt.Skip建议here

Mapper.CreateMap<NestedB, NestedA>() 
.ForMember(s => s.S, opt => opt.Skip(src => !string.IsNullOrWhiteSpace(src.S))); 

编辑:

源一些挖后。我发现在TypeMapObjectMapperRegistry类(处理嵌套对象的映射的类)中,它会在查看目标值是否需要保留(使用UseDestinationValue)之前返回。否则,我会建议这样的:

Mapper.CreateMap<B, A>(); 
      Mapper.CreateMap<NestedB, NestedA>() 
       .ForMember(s => s.S, opt => opt.Condition(src => !string.IsNullOrWhiteSpace(src.S))) 
       .ForMember(s => s.S, opt => opt.UseDestinationValue()); 

我发现this哪里吉米似乎在这里讨论的核心问题。

因此,从我发现的情况来看,似乎没有办法同时使用Condition和UseDestinationValue。

+0

即时通讯使用AutoMapper v2,并没有跳过选项。 – user1183964 2012-02-02 10:28:54