automapper - 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 具有映射 Pre/PostFixes 的功能。
默认情况下,它知道前缀“Get”并尝试将源方法映射GetValue[T]()
到目标属性Value
。但是,它默认不知道如何映射泛型方法,因此映射失败。
要解决此问题,有两种选择:
- 重命名方法以不包括“获取”
- 如以下文档中所述,使用以下命令清除前缀:
cfg.ClearPrefixes()
此行为在此处简要定义: https ://docs.automapper.org/en/stable/Configuration.html#recognizing-pre-postfixes
推荐阅读
- php - PHP用回声修复未定义的错误?但不起作用
- javascript - 使用 Javascript/jQuery 从 CDATA 渲染 HTML
- python - 使用 Dask 从单个固定宽度文件中获取列并放入新 CSV 文件的最快方法
- c# - 代码重构以删除重复代码
- c# - Swig:如何在回调中获取字符串
- java - 如何将两个表记录映射到java对象列表
- go - VS Code Go 扩展由于无法更改 go.mod 而无法加载?
- c - 为什么用浮点数除以整数会导致浮点数?
- asp.net-core - 如何在 Azure AD 中使用自定义 IUserRoleStore
- rust - 当忽略某些值时,如何在迭代器实现中避免不必要的昂贵操作?