我使用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}}的不重复。该问题涉及未映射的属性,我的问题是关于未映射的类型。答案中建议的代码在这里没有帮助。
它也不是Force throwing of exception when a source property is unmapped 的副本。 Is AutoMapper AssertConfigurationIsValid enough to ensure good mapping?说:
AutoMapper检查以确保每个Destination类型成员在源类型上都有对应的类型成员。
所以这是检查现有的类型映射是否有效,而不是首先存在类型映射。
我不认为我的问题(缺少继承类型的映射目标类型)可以通过静态分析来检测。但是,我认为当我尝试映射这个继承的类型而不是返回null
时,AutoMapper会在运行时抛出异常会更好(也更一致)。