使用AutoMapper时出现以下错误
方法' GetEnumerator'在类型'代理'来自汇编' AutoMapper.Proxies,Version = 0.0.0.0,Culture = neutral,PublicKeyToken = be96cd2c38ef1005'没有实施。
在我的存储库中,我有一个私有方法
private IMapper GetMapper()
{
var config = new MapperConfiguration(cfg => {
cfg.CreateMap<MyClass, PersistenceModels.MyClass>();
cfg.CreateMap<IEnumerable<PersistenceModels.MyClass>, IEnumerable<MyClass>>();
});
return new Mapper(config);
}
然后我用这个如下
var mapper = GetMapper();
var userInfo = mapper.Map<IEnumerable<PersistenceModels.MyClass>, IEnumerable<MyClass>>(userInfoRaw);
MyClass
类型相同且具有IEnumerable
属性
public IEnumerable<string> ImageUris { get; set; }
任何想法如何解决这个问题?
修改
我不是接口定义的映射类型,我正在映射具体类型的集合,因此是IEnumerable
接口。
答案 0 :(得分:16)
解决方案是在创建地图时不使用IEnumerable
,仅在使用地图时。
所以,在配置中我改变了
cfg.CreateMap<IEnumerable<PersistenceModels.MyClass>, IEnumerable<MyClass>>();
到
cfg.CreateMap<PersistenceModels.MyClass, MyClass>();
一切正常。
答案 1 :(得分:7)
我遇到了同样的问题。我想AutoMapper希望被告知IEnumerable的哪个实现用于目标,所以以下内容对我有用。
cfg.CreateMap<IEnumerable<PersistenceModels.MyClass>, List<MyClass>>();
^^^^
答案 2 :(得分:1)
这是较旧的,但如果您从Google来到这里可能有帮助...
假设:
cfg.CreateMap<PersistenceModels.MyClass, MyClass>();
你需要IEnumerable你的目的地:
var perData = dbContext.SomeDbSet.Where(.....);
var mapData = Mapper.Map<IEnumerable<MyClass>>(perData);
答案 3 :(得分:1)
使用IList时发生相同的问题。因此,请从IEnumerable或IList切换到目标类型中的列表。应该可以。
答案 4 :(得分:0)
这是不必要的:
mapper.Map<IEnumerable<PersistenceModels.MyClass>, IEnumerable<MyClass>>(userInfoRaw);
您必须只使用map类型(不包含集合):
mapper.Map<PersistenceModels.MyClass, MyClass>(userInfoRaw);