AutoMapper 映射嵌套 属性 对象类型

AutoMapper mapping nested propery of object-type

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

简单示例:

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 class 正确映射到 Namespace20.OuterInner 对象的类型是 Namespace10.Inner(而不是 if Namespace20 ). 因为我的 classes 是从网络服务 (svcUtil) 生成的(其中字段是一个选择类型(可以是两个 classes 之一)因此创建为对象类型。

有没有方便的方法解决这个问题?

因为映射配置没有自定义规则将object映射到object。可能的解决方法是手动添加 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