c# - 自动映射器在继承类型之间进行映射的意外行为

标签 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。

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

最佳答案

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

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
{
}

关于c# - 自动映射器在继承类型之间进行映射的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9116696/

相关文章:

c# - 在绑定(bind)源中复制记录

linq-to-sql - AutoMapper 是否支持 Linq?

c# - AutoMapper TypeConverter 将可空类型映射到不可空类型

c# - Automapper - 使用 IEnumerable<anotherType> 映射对象

c# - 获取当前的笔记本电脑盖子状态

c# - WCF数据服务-从mysql查看超时过期问题

php - 为什么这个mysqli准备好的语句不起作用?

list - 在 Matlab 中实现对象容器的最佳方式

c# - 如何使用 JSON.NET 遍历嵌套字典?

c++ - 使用 C++ OOP 设计更新总值