我正在尝试使用IncludeBase。它似乎在基类上具有相同的命名属性的问题。这些不包括在基本映射中,而是自动解析。我正在使用automapper版本4.2。
与此类似的情况:
class Program
{
static void Main(string[] args)
{
MapperConfiguration conf = new MapperConfiguration((cfg) =>
{
cfg.CreateMap<FooBase, FooModelBase>()
.ForMember(e => e.Error, opt => opt.Ignore());
cfg.CreateMap<Foo, FooModel>()
.IncludeBase<FooBase, FooModelBase>();
});
IMapper mapper = conf.CreateMapper();
//works just fine
FooModelBase fooModelBase = mapper.Map<FooModelBase>(new FooBase());
//throws an exception
FooModel fooModel = mapper.Map<FooModel>(new Foo());
}
}
class FooBase
{
public string Error { get; set; }
}
class Foo : FooBase { }
class FooModelBase
{
public string Error
{
get { throw new NotImplementedException(); }
set { throw new NotImplementedException(); }
}
}
class FooModel : FooModelBase { }
我曾预料到,该应用程序不会抛出异常,但确实如此。有什么建议如何解决这个问题?
答案 0 :(得分:2)
这里的关键是 AutoMapper 如何确定继承映射的可能来源的优先级
正如您在 Automapper GitHub Project 中的this link中所看到的,当您包含继承的映射时,会引入额外的复杂性,因为可以通过多种方式映射属性。
这些来源的优先顺序如下:
.MapFrom()
)所以&#39;继承忽略属性映射&#39;被忽略或优先级较低。
这里发生的事情就是&#39;会议制图&#39;具有更高的优先级,因此属性仍然被映射。
您可以解决此问题,在派生地图配置中明确添加Ignore()
:
cfg.CreateMap<Foo, FooModel>()
.ForMember(e => e.Error, opt => opt.Ignore())
.IncludeBase<FooBase, FooModelBase>();