AutoMapper 与 .Net 8:System.ArgumentException:为调用方法“System.String get_Item(System.String)”提供的参数数量不正确

问题描述 投票:0回答:3

我已经尝试了所有方法,但没有一个有效。 我将我的 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());
});

我不知道是什么原因造成的

automapper .net-8.0
3个回答
0
投票

这不是您在 .Net 8 中实际问题的解决方案,但当我从 .net Core 升级到 .Net 8 时,我遇到了类似的问题。

但是.Net 6.0似乎可以与AutoMapper 8.0.0和AutoMapper.Extensions.Microsoft.DependencyInjection 6.0.0一起使用

也许可以将其用作临时措施,.Net 6 的支持期还有几个月。


0
投票

自从使用.net 8以来我也遇到了同样的错误。现在有解决方案吗?


-1
投票

我发现了这个问题,这是在.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 之前可以正常使用它,我希望他们修复它。我会开一张有关它的票。

尼诺斯

© www.soinside.com 2019 - 2024. All rights reserved.