2017-09-13 80 views
1

我可以看到,AutoMapper支持Open GenericsInheritance,但我無法讓它與這兩者結合使用。AutoMapper是否支持同時打開泛型和繼承?

鑑於

public class Foo 
{ 
    public int Id { get; set; } 
} 

public class Bar<T> : Foo 
{ 
    public T Value { get; set; } 
} 

,並假設互補類的FooDtoBarDto<T> : FooDto然後將下面的行拋出一個無效的轉換異常說,它不能從FooDto轉換爲BarDto<EntityDto>

Mapper.Map<Bar<Entity>, BarDto<EntityDto>>(AMethodWhichReturnsABar<Entity>()); 

我曾嘗試映射如下:

Mapper.CreateMap<Entity, EntityDto>(); 
Mapper.CreateMap<Foo, FooDto>(); 
Mapper.CreateMap(typeof(Bar<>), typeof(BarDto<>)); 

Mapper.CreateMap<Entity, EntityDto>(); 
Mapper.CreateMap<Foo, FooDto>() 
    .Include(typeof(Bar<>), typeof(BarDto<>)); 
Mapper.CreateMap(typeof(Bar<>), typeof(BarDto<>)); 

兩者均導致InvalidCastException的。唯一可行的是,如果我明確地映射封閉通用像這樣:

Mapper.CreateMap<Entity, EntityDto>(); 
Mapper.CreateMap<Foo, FooDto>(); 
Mapper.CreateMap<Bar<Entity>, BarDto<EntityDto>>() 

這是不錯,但它意味着我將不得不添加映射爲每個封閉寬泛的組合我有可能。

AutoMapper提供了這個功能嗎?我只是做錯了嗎?或者我堅持爲每個我需要使用的組合添加一個映射?

+0

首先讓它在沒有泛型的情況下工作,然後將它們添加回來,看看你得到了什麼。 –

+0

[Here](https://github.com/AutoMapper/AutoMapper/blob/eb1a445b373acfac3895e9fd308c43e070db546e/src/UnitTests/MappingInheritance/ShouldSupportOnlyDestinationTypeBeingDerived.cs)就是一些例子。 –

+0

@LucianBargaoanu如果我刪除泛型並將Value屬性設置爲Entity和EntityDto,那麼它可以與我最初嘗試的兩種映射中的任何一種一起使用。將T加回來導致相同的錯誤。 – thudbutt

回答

0

我的問題的答案是肯定的。相反,令人尷尬的是我不能這樣做的原因是因爲我正在使用AutoMapper 4.0.4進行測試。使用6.1.1允許你做以下和按預期工作:

MapperConfiguration config = new MapperConfiguration(c =>  
{  
    c.CreateMap<Entity, EntityDto>(); 
    c.CreateMap(typeof(Foo), typeof(FooDto)); 
    c.CreateMap(typeof(Bar<>), typeof(BarDto<>));; 
}); 

config.AssertConfigurationIsValid();  
var mapper = config.CreateMapper(); 

BarDto<EntityDto> result = mapper.Map<Bar<Entity>, BarDto<EntityDto>>(AMethodWhichReturnsABar<Entity>()); 

我已經離開我的問題和回答的,最初的時候我一直在尋找,我看不出任何地方明確指出,我被問到是支持。