首页 > 解决方案 > Automapper throws System.ArgumentException Method T GetValue[T]() 是一个泛型方法定义(参数'method')

问题描述

我正在为我开发一个相当大的 Blazor Web 应用程序,并使用 Automapper 来简化映射。升级到 VS 2019 并更新到最新的 nuget 包后,我收到此错误:

 avsweb.ApplicationTests.Mappings.MappingTests.ShouldHaveValidConfiguration
   Source: MappingTests.cs line 69
   Duration: 1 ms

  Message: 
    System.ArgumentException : Method T GetValue[T]() is a generic method definition (Parameter 'method')
  Stack Trace: 
    Expression.ValidateMethodInfo(MethodInfo method, String paramName)
    Expression.ValidateMethodAndGetParameters(Expression instance, MethodInfo method)
    Expression.Call(Expression instance, MethodInfo method)
    <>c.<MemberAccesses>b__3_0(Expression inner, MemberInfo getter)
    Enumerable.Aggregate[TSource,TAccumulate](IEnumerable`1 source, TAccumulate seed, Func`3 func)
    ExpressionFactory.MemberAccesses(IEnumerable`1 members, Expression obj)
    TypeMapPlanBuilder.Chain(IMemberMap memberMap, Type destinationType)
    TypeMapPlanBuilder.BuildValueResolverFunc(IMemberMap memberMap, Expression destValueExpr, Expression defaultValue)
    TypeMapPlanBuilder.CreatePropertyMapFunc(IMemberMap memberMap, Expression destination, MemberInfo destinationMember)
    TypeMapPlanBuilder.CreateAssignmentFunc(Expression destinationFunc)
    TypeMapPlanBuilder.CreateMapperLambda(HashSet`1 typeMapsPath)
    TypeMap.CreateMapperLambda(IConfigurationProvider configurationProvider, HashSet`1 typeMapsPath)
    TypeMap.Seal(IConfigurationProvider configurationProvider)
    MapperConfiguration.Seal()
    MapperConfiguration.ctor(MapperConfigurationExpression configurationExpression)
    <>c.<AddAutoMapperClasses>b__12_2(IServiceProvider sp)
    CallSiteRuntimeResolver.VisitFactory(FactoryCallSite factoryCallSite, RuntimeResolverContext context)
    CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument)
    CallSiteRuntimeResolver.VisitCache(ServiceCallSite callSite, RuntimeResolverContext context, ServiceProviderEngineScope serviceProviderEngine, RuntimeResolverLock lockType)
    CallSiteRuntimeResolver.VisitRootCache(ServiceCallSite singletonCallSite, RuntimeResolverContext context)
    CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument)
    CallSiteRuntimeResolver.Resolve(ServiceCallSite callSite, ServiceProviderEngineScope scope)
    <>c__DisplayClass1_0.<RealizeService>b__0(ServiceProviderEngineScope scope)
    ServiceProviderEngine.GetService(Type serviceType, ServiceProviderEngineScope serviceProviderEngineScope)
    ServiceProviderEngineScope.GetService(Type serviceType)
    ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType)
    ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider)
    <>c.<AddAutoMapperClasses>b__12_3(IServiceProvider sp)
    CallSiteRuntimeResolver.VisitFactory(FactoryCallSite factoryCallSite, RuntimeResolverContext context)
    CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument)
    CallSiteRuntimeResolver.VisitDisposeCache(ServiceCallSite transientCallSite, RuntimeResolverContext context)
    CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument)
    CallSiteRuntimeResolver.Resolve(ServiceCallSite callSite, ServiceProviderEngineScope scope)
    <>c__DisplayClass1_0.<RealizeService>b__0(ServiceProviderEngineScope scope)
    ServiceProviderEngine.GetService(Type serviceType, ServiceProviderEngineScope serviceProviderEngineScope)
    ServiceProviderEngine.GetService(Type serviceType)
    ServiceProvider.GetService(Type serviceType)
    ServiceProviderServiceExtensions.GetService[T](IServiceProvider provider)
    MappingTests.ctor(ITestOutputHelper _outputHelper) line 65

Automapper 使用 ServiceCollection 扩展注册。所有的 ValuResolver 都是通过自定义服务扩展注册的。
我现在没有胶水可以看。有人有提示吗?

标签: automapper

解决方案


对于以后遇到这篇文章并且“删除通用方法”的任何人都不是答案:AutoMapper 具有映射 Pre/PostFixes 的功能。

默认情况下,它知道前缀“Get”并尝试将源方法映射GetValue[T]()到目标属性Value。但是,它默认不知道如何映射泛型方法,因此映射失败。

要解决此问题,有两种选择:

  • 重命名方法以不包括“获取”
  • 如以下文档中所述,使用以下命令清除前缀:cfg.ClearPrefixes()

此行为在此处简要定义: https ://docs.automapper.org/en/stable/Configuration.html#recognizing-pre-postfixes


推荐阅读