私はAutoMapperがOpen GenericsとInheritanceをサポートしているのを見ることができますが、私はそれを2つの組み合わせで動作させることはできません。AutoMapperはオープンジェネリックと継承を同時にサポートしますか?
public class Foo
{
public int Id { get; set; }
}
public class Bar<T> : Foo
{
public T Value { get; set; }
}
とFooDto
とBarDto<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のすべての組み合わせに対してマッピングを追加していますか?
まず、ジェネリックスなしで動作させてから、それらを再び追加して、あなたが得るものを見てください。 –
[Here](https://github.com/AutoMapper/AutoMapper/blob/eb1a445b373acfac3895e9fd308c43e070db546e/src/UnitTests/MappingInheritance/ShouldSupportOnlyDestinationTypeBeingDerived.cs)はいくつかの例です。 –
@ LucianBargaoanuジェネリックを削除し、ValueプロパティをEntityとEntityDtoにすると、元々試した2つのマッピングのいずれかで動作します。 Tバックを追加すると、同じエラーが発生します。 – thudbutt