使用继承类型之间的映射自动执行意外行为

时间:2012-02-02 17:11:47

标签: c# oop automapper

我有以下情况(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中,无法处理我的复杂类型,因此如果你愿意的话就试着扔掉它)会抛出一个异常,告诉我MyCT仍然挂着围绕myB对象。

当我调试时,我可以将其投射到A,并且确定我可以访问MyCT。

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

2 个答案:

答案 0 :(得分:2)

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

Mapper.CreateMap<A, B>();

(如果您查看Getting Started指南,它会提供一些提示,说明如何在应用程序启动时将这些映射配置集中在一个位置。)

看起来如果没有定义两种类型之间的映射,Automapper将回退到A实例的向上转换为B类型。你实际上想要实现一个flattening,只有当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
{
}

答案 1 :(得分:1)

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