【问题标题】:AutoMapper mapping nested propery of object-typeAutoMapper 映射对象类型的嵌套属性
【发布时间】:2016-04-25 13:21:16
【问题描述】:

当我使用 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 类中的结果正确映射到 Namespace20.Outer,但 Inner 对象的类型为 Namespace10.Inner(而不是 Namespace20)。 由于这是我的类是从 web 服务 (svcUtil) 生成的(其中字段是选择类型(可以是两个类之一),因此被创建为对象类型。

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

【问题讨论】:

    标签: c# automapper


    【解决方案1】:

    这是因为映射配置没有自定义规则将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

    【讨论】:

    • 谢谢!这行得通。我采取了额外的映射选项路线。
    猜你喜欢
    • 1970-01-01
    • 2017-07-20
    • 2012-07-19
    • 1970-01-01
    • 2016-03-20
    • 1970-01-01
    • 2020-04-03
    • 2022-01-06
    • 1970-01-01
    相关资源
    最近更新 更多