当基类是抽象时,映射继承类型返回null

时间:2017-05-12 14:29:59

标签: c# inheritance automapper

我使用AutoMapper映射C#中的一些继承类。让我们说我有以下类(属性省略):

abstract class Animal {}
class Bird : Animal {}

abstract class Animal2 {}
class Bird2 : Animal2 {}

这个AutoMapper配置。

...
cfg.CreateMap<Animal, Animal2>()
   .Include<Bird, Bird2>();

cfg.CreateMap<Bird, Bird2>(); // This seems a bit repetitive?
...

这映射到子类型,这一切都很棒。

Animal source = new Bird();
var result = mapper.Map<Animal2>(source);
result.Should().BeOfType<Bird2>(); // Yay

但是,如果我添加一个新的子类型并忘记为它配置一个映射(这几乎可以保证在应用程序的生命周期内发生)怎么办?

class Fish : Animal {}
...
Animal source = new Fish();
var result = mapper.Map<Animal2>(source);
// Argh, result is null!

在这种情况下,AutoMapper会悄悄地返回null值,这可能会导致应用程序失败。

可以将AutoMapper配置为在这种情况下抛出一个有意义的异常吗?(与不使用继承类型时一样)。

或者我只需要用我自己的方法包装所有Map()次来检查null s?

更新

这是<{3}}的不重复。该问题涉及未映射的属性,我的问题是关于未映射的类型。答案中建议的代码在这里没有帮助。

更新2

它也不是Force throwing of exception when a source property is unmapped 的副本。 Is AutoMapper AssertConfigurationIsValid enough to ensure good mapping?说:

  

AutoMapper检查以确保每个Destination类型成员在源类型上都有对应的类型成员。

所以这是检查现有的类型映射是否有效,而不是首先存在类型映射。

我不认为我的问题(缺少继承类型的映射目标类型)可以通过静态分析来检测。但是,我认为当我尝试映射这个继承的类型而不是返回null时,AutoMapper会在运行时抛出异常会更好(也更一致)。

0 个答案:

没有答案