.NET 8升级后AutoMapper启动报错:参数数量不正确
解决.NET 8升级后AutoMapper启动报错问题
问题分析
报错信息Incorrect number of arguments supplied for call to method System.String get_Item(System.String)指向AutoMapper在处理索引器属性(如this[string key]这类带参数的属性)时出现解析错误,同时你的Startup中存在重复的AutoMapper配置方式,两种情况共同导致升级后的启动失败。
解决方案
1. 移除重复的AutoMapper配置
你的Startup中同时使用了两种配置方式,冗余且易引发冲突,保留官方DI扩展的正确用法即可:
public void ConfigureServices(IServiceCollection services) { // 仅保留这一行,自动扫描AutoMapperConfig所在程序集的所有Profile services.AddAutoMapper(typeof(AutoMapperConfig)); // 删除以下手动配置代码 /* var mappingConfig = new MapperConfiguration(mc => { mc.AddProfile(new AutoMapperConfig()); }); IMapper mapper = mappingConfig.CreateMapper(); services.AddSingleton(mapper); */ }
2. 处理索引器属性映射错误
错误根源是AutoMapper尝试自动映射带参数的索引器属性(如字典的this[string]),无法正确解析参数。在Profile中添加全局忽略规则:
public class AutoMapperConfig : Profile { public AutoMapperConfig() { // 全局忽略所有带参数的索引器属性 ForAllMaps((typeMap, mappingExpr) => { var indexerMembers = typeMap.DestinationType.GetMembers() .Where(m => m is PropertyInfo prop && prop.GetGetMethod()?.GetParameters().Length > 0); foreach (var member in indexerMembers) { mappingExpr.ForMember(member.Name, opt => opt.Ignore()); } }); // 保留原有映射配置 CreateMap<Client, ClientView>() .ForMember(target => target.Properties, source => source.Ignore()) .ForMember(dest => dest.IsActive, opt => opt.MapFrom(src => src.StatusCode == 1)) .ReverseMap().ForMember(target => target.Properties, source => source.Ignore()); // 其他映射... } }
3. 确保版本匹配
针对.NET 8,使用对应版本的包组合:
- AutoMapper 13.x
- AutoMapper.Extensions.Microsoft.DependencyInjection 13.x
避免跨主版本混用包(如AutoMapper 12搭配Extensions 13)。
4. 排查.NET Framework类库兼容性
由于项目引用了.NET Framework 4.8.1类库,可按以下步骤排查:
- 暂时移除该类库引用,测试项目是否能正常启动
- 若启动正常,说明问题出在Framework类库的实体类中,检查是否存在特殊索引器或异常属性定义
- 逐个恢复类库引用,定位具体引发错误的类
内容的提问来源于stack exchange,提问作者Ninos
相关产品推荐
相关产品推荐

