2017-09-13 8 views
1

私はAutoMapperがOpen GenericsInheritanceをサポートしているのを見ることができますが、私はそれを2つの組み合わせで動作させることはできません。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<>)); 
InvalidCastExceptionがもたらすどちらも

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

。私は明示的にそうようなクローズドジェネリックをマッピングする場合で働く唯一の事:

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

は、これは結構ですが、それは私が私が持っている可能性があるすべてのクローズジェネリックの組み合わせのマッピングを追加する必要がありますを意味します。

この機能はAutoMapperが提供する機能ですが、間違っているだけですか?または、私は使用する必要があるTのすべての組み合わせに対してマッピングを追加していますか?

+0

まず、ジェネリックスなしで動作させてから、それらを再び追加して、あなたが得るものを見てください。 –

+0

[Here](https://github.com/AutoMapper/AutoMapper/blob/eb1a445b373acfac3895e9fd308c43e070db546e/src/UnitTests/MappingInheritance/ShouldSupportOnlyDestinationTypeBeingDerived.cs)はいくつかの例です。 –

+0

@ LucianBargaoanuジェネリックを削除し、ValueプロパティをEntityとEntityDtoにすると、元々試した2つのマッピングのいずれかで動作します。 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>()); 

私は私が探していた元々とき、私の質問を離れ、と答えましたが、私は明示的にどのようなIと述べているどこでも見ることができませんでしたサポートされていたと尋ねていた。