AutoMapper是否同时支持Open Generics和Inheritance?

时间:2017-09-13 15:40:34

标签: c# generics automapper

我可以看到AutoMapper支持Open GenericsInheritance,但我无法将其与两者结合使用。

鉴于

java -jar appname.jar

并假设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<>));

这很好,但这意味着我必须为我可能拥有的每个封闭的通用组合添加一个映射。

这个功能是AutoMapper提供的功能吗?我做错了吗?或者我是否坚持为每个需要使用的T组合添加映射?

1 个答案:

答案 0 :(得分: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>());

我已经离开了我的问题并回答说,原来当我在看的时候,我看不到任何明确表示我所要求的内容得到支持的地方。