在继承的类型之间映射的自动映射程序意外行为
本文关键字:映射程序 意外 映射 继承 类型 之间 | 更新日期: 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>()
。