.NET Framework 4.6下AutoMapper 7.0.1实例调用Map方法报错求助
解决AutoMapper 7.0.1中实例调用Map方法的编译错误
问题原因
在AutoMapper 7.0.1版本中,Mapper.Map<T>(object source)是静态方法,归属于Mapper类本身,而非Mapper实例的成员方法。你代码中试图通过mapper实例调用这个静态方法,就会触发编译器报错:
Member 'Mapper.Map(object)' cannot be accessed with an instance reference; qualify it with a type name instead
而新版AutoMapper(适配.NET 8的版本)重构了API,将该泛型重载迁移到了IMapper实例接口中,所以在新环境下代码可以正常运行。
解决方案
方案一:使用实例方法的正确泛型重载(推荐)
修改报错行的代码,同时指定源类型和目标类型,调用实例支持的Map<TSource, TDestination>重载:
foreach (var datum in data) { var extendedDatum = mapper.Map<DatumModel, ExtendedDatumModel>(datum); }
方案二:使用非泛型实例Map方法
如果不想使用泛型重载,可以调用接收类型参数的非泛型实例方法,再强制转换结果:
foreach (var datum in data) { var extendedDatum = (ExtendedDatumModel)mapper.Map(datum, typeof(DatumModel), typeof(ExtendedDatumModel)); }
方案三:使用静态Mapper方式(不推荐)
若坚持使用Map<T>的静态重载,需要先通过配置初始化静态Mapper(注意:静态Mapper存在线程安全和配置隔离问题,不建议在复杂场景使用):
static void Main(string[] args) { var config = new MapperConfiguration(cfg => { cfg.CreateMap<DatumModel, ExtendedDatumModel>(); }); // 初始化静态Mapper Mapper.Initialize(cfg => cfg.CreateMap<DatumModel, ExtendedDatumModel>()); // 验证配置(可选但推荐) config.AssertConfigurationIsValid(); var data = new List<DatumModel>(); data.Add(new DatumModel { Value = 1 }); foreach (var datum in data) { var extendedDatum = Mapper.Map<ExtendedDatumModel>(datum); } }
内容的提问来源于stack exchange,提问作者Ludovic Wagner
相关产品推荐
相关产品推荐

