我已经尝试了所有方法,但没有一个有效。 我将我的 WebApp MVC 项目从 .Net Core 3.1 升级到 .Net 8(输出类型:控制台应用程序)。
该项目引用了其他项目,其中一些项目基于 .Net Framework 4.8.1,另一些项目基于 .Net 8 类库项目
AutoMapper 配置文件 (AutoMapperConfig.cs) 类位于类库 .Net 8 项目中。
一切都工作正常,直到我升级到:
.Net 8 AutoMapper 12.0.1 或 13.0.1 或任何其他先前版本
这是一个示例类配置文件映射,我在 AutoMapperConfig.cs 中尝试了此代码,如果我将其注释掉,应用程序仍然无法启动,但至少由于没有预期的类映射而失败。
public class AutoMapperConfig : Profile
{
public AutoMapperConfig()
{
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());
...
}
}
我的 Startup.cs 类中有以下调用
public void ConfigureServices(IServiceCollection services)
{
services.AddAutoMapper(config =>
{
config.AddProfile(new AutoMapperConfig());
});
//Auto Mapper Configurations
var mappingConfig = new MapperConfiguration(mc =>
{
mc.AddProfile(new AutoMapperConfig());
});
//create and configure mapper
IMapper mapper = mappingConfig.CreateMapper();
services.AddSingleton(mapper);
我尝试过这些不同的 AutoMapper 版本组合。
仅限 AutoMapper 13.0.1 或者 AutoMapper 12.0.1 和 AutoMapper.Extensions.Microsoft.DependencyInjection 12.0.0/12.0.1
在升级之前,我的 WebApp 一直运行良好,没有任何问题。
但是现在 WebApp 甚至无法启动并抛出此错误:
错误:之前它显示在浏览器中,但现在只有当我使用 IIS Express 运行 VS 2022 时才能在日志文件中看到它。
Error: System.ArgumentException: Incorrect number of arguments supplied for call to method System.String get_Item(System.String) (Parameter "property")
at System.Linq.Expressions.Expression.Property(Expression expression, PropertyInfo property)
at AutoMapper.Execution.TypeMapPlanBuilder.CreatePropertyMapFunc(MemberMap memberMap, Expression destination, MemberInfo destinationMember)
at AutoMapper.Execution.TypeMapPlanBuilder.AddPropertyMaps(List1 actions) at AutoMapper.Execution.TypeMapPlanBuilder.CreateAssignmentFunc(Expression createDestination) at AutoMapper.Execution.TypeMapPlanBuilder.CreateMapperLambda() at AutoMapper.TypeMap.CreateMapperLambda(IGlobalConfiguration configuration) at AutoMapper.TypeMap.Seal(IGlobalConfiguration configuration) at AutoMapper.MapperConfiguration.<.ctor>g__Seal|20_0() at AutoMapper.MapperConfiguration..ctor(MapperConfigurationExpression configurationExpression) at AutoMapper.MapperConfiguration..ctor(Action1 configure)
at eSignWebMVC.Startup.ConfigureServices(IServiceCollection services) in C:\Users\denkhnin\Documents\Source\Main\eSign\eSignWebMvc\Source\Red.eSign.WebMvc\Startup.cs:line 60
at System.RuntimeMethodHandle.InvokeMethod(Object target, Void arguments, Signature sig, Boolean isConstructor)
at System.Reflection.MethodBaseInvoker.InvokeDirectByRefWithFewArgs(Object obj, Span`1 copyOfArgs, BindingFlags invokeAttr)
at System.Reflection.MethodBaseInvoker.InvokeWithOneArg(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at Microsoft.AspNetCore.Hosting.ConfigureServicesBuilder.InvokeCore(Object instance, IServiceCollection services)
at Microsoft.AspNetCore.Hosting.GenericWebHostBuilder.UseStartup(Type startupType, HostBuilderContext context, IServiceCollection services, Object instance)
at Microsoft.AspNetCore.Hosting.GenericWebHostBuilder.<>c__DisplayClass7_0.b__0(HostBuilderContext context, IServiceCollection services)
at Microsoft.Extensions.Hosting.HostBuilder.InitializeServiceProvider()
at Microsoft.Extensions.Hosting.HostBuilder.Build()
at eSignWebMVC.Program.Main(String[] args) in C:\Users\denkhnin\Documents\Source\Main\eSign\eSignWebMvc\Source\Red.eSign.WebMvc\Program.cs:line 34
从堆栈跟踪“Startup.cs:line 60”来看,当在 Startup 类中执行此代码时,会出现问题。
var mappingConfig = new MapperConfiguration(mc =>
{
mc.AddProfile(new AutoMapperConfig());
});
我不知道是什么原因造成的
这不是您在 .Net 8 中实际问题的解决方案,但当我从 .net Core 升级到 .Net 8 时,我遇到了类似的问题。
但是.Net 6.0似乎可以与AutoMapper 8.0.0和AutoMapper.Extensions.Microsoft.DependencyInjection 6.0.0一起使用
也许可以将其用作临时措施,.Net 6 的支持期还有几个月。
自从使用.net 8以来我也遇到了同样的错误。现在有解决方案吗?
我发现了这个问题,这是在.Net 8上运行的最新版本的AutoMapper的一个错误。错误是这样的:
AutoMapper 不会支持 C# 类索引器,如下所示:
public class MyClass
{ ...
public IDictionary Properties
{
get;
set;
}
public string this[string propertyName]
{
get
{
if (Properties != null)
{
if (Properties.Contains(propertyName))
return (string) Properties[propertyName];
return string.Empty;
set
{
Properties[propertyName] = value;
}
}
public string GetProperty(string propertyName)
{
if (Properties != null)
{
if (Properties.Contains(propertyName))
return (string)Properties[propertyName];
}
return string.Empty;
}
public void SetProperty(string propertyName, string value)
{
if (Properties != null)
{
Properties[propertyName] = value;
}
}
}
注意问题在于
public string this[string propertyName]
错误消息很笼统,但后来想了想,我发现上面可能就是这样。 为了解决这个问题,我引入了 GetProperty 和 SetProperty 函数。
由于这是正常的 C# 语法,并且 AutoMapper 之前可以正常使用它,我希望他们修复它。我会开一张有关它的票。
尼诺斯