2016-04-25 118 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

謝謝!這工作。我採取了額外的映射選項路線。 –