2016-04-25 127 views
1

当我使用AutoMapper将对象从命名空间映射到另一个命名空间(具有相同的数据类型)时,它似乎映射到错误的命名空间。AutoMapper映射对象类型的嵌套索引

Simple示例:

namespace AutoMapperSamples.Namespace10 
{ 
    public class Outer 
    { 
    public int Value { get; set; } 
    public object Inner { get; set; } 
    } 
} 

namespace AutoMapperSamples.Namespace20 
{ 
    public class Outer 
    { 
    public int Value { get; set; } 
    public object Inner { get; set; } 
    } 
} 

映射这样:

var dest = config.CreateMapper().Map<Namespace10.Outer, Namespace20.Outer>(source); 

结果Outer类正确地映射到Namespace20.OuterInner目的是Namespace10.Inner型的(而不是如果Namespace20)。 由于这我的类是从web服务(SvcUtil工具)(其中场是一个选择类型生成(其可以是两个类中的一个),因此创建为对象类型。

有没有解决这个一种方便的方法?

回答

1

这是因为映射配置没有自定义规则映射objectobject可能的解决方法是添加AfterMap行动和映射手动Inner属性:。

public MapperConfiguration Config { get; set; } 

[SetUp] 
public void SetUp() 
{ 
    var innerConfig = new MapperConfiguration(cfg => 
    { 
     cfg.CreateMap<Namespace10.Inner, Namespace20.Inner>(); 
    }); 

    var config = new MapperConfiguration(cfg => 
    { 
     cfg.CreateMap<Namespace10.Outer, Namespace20.Outer>() 
     .AfterMap((src, dest) => 
     { 
      dest.Inner = innerConfig.CreateMapper().Map<Namespace20.Inner>(src.Inner as Namespace10.Inner); 
     }); 
    }); 

    Config = config; 
} 

[Test] 
public void Map() 
{ 
    Namespace10.Outer source = new Namespace10.Outer(); 
    source.Inner = new Namespace10.Inner(); 
    var dest = Config.CreateMapper().Map<Namespace10.Outer, Namespace20.Outer>(source); 

    Assert.AreEqual(typeof(Namespace20.Inner).FullName, dest.Inner.GetType().FullName); 
} 

您可以使用Custom value resolver代替

+0

谢谢!这工作。我采取了额外的映射选项路线。 –