在继承的类型之间映射的自动映射程序意外行为

本文关键字:映射程序 意外 映射 继承 类型 之间 | 更新日期: 2023-09-27 18:22:11

我有以下情况(C#):

public class A: B
{
      public ComplexType MyCT {get;set;}
}
public class B: 
{
      public string MyString {get;set;}
}

我有一个A的实例,我想使用Automapper将其映射到B的实例,因为映射后我不需要"MyCT"(这显然是一个精简版)。

B myB = Mapper.Map<A, B>(myA);

但当我尝试用myB做一些事情时(我将它保存到Azure中,Azure无法处理我的复杂类型,因此如果你愿意,可以尝试将其丢弃),会抛出一个异常,告诉我MyCT仍挂在myB对象上。

当我调试时,我可以将其转换为A,并且我可以访问MyCT。

缺少的是,我觉得我从根本上缺少了一些东西,可能与这两种类型之间的继承有关。

在继承的类型之间映射的自动映射程序意外行为

看起来您还没有为这两种类型定义映射,它只是:

Mapper.CreateMap<A, B>();

(如果你看一下《入门指南》,它会提示你如何在应用程序启动时将这些映射配置集中在一个地方。)

看起来,在没有定义这两种类型之间的映射的情况下,Automapper将回退到A实例到B类型的上转换。实际上,您想要实现平坦化,只有当Automapper明确了解这两种类型之间的映射时,它才能做到这一点。

下面的代码示例说明了这一点:

using System;
using AutoMapper;
class Program
{
    static void Main(string[] args)
    {
        B b = Mapper.Map<A, B>(new A());
        Console.WriteLine(b.GetType()); //A
        Mapper.CreateMap<A, B>();       //define the mapping
        b = Mapper.Map<A, B>(new A());
        Console.WriteLine(b.GetType()); //B
        Console.ReadLine();
    }
}
public class A: B
{
}
public class B
{
}

添加Mapper.CreateMap<A, B>()