C# 使用动态 lambda 但在选择要使用的方法时得到不明确的匹配

SI2030

根据 Pashov 的博客文章,我有以下静态方法用于在过滤器选项之间进行选择。

public static class ExpressionRetriever  
    {  
        private static MethodInfo containsMethod = typeof(string).GetMethod("Contains");  
        private static MethodInfo startsWithMethod = typeof(string).GetMethod("StartsWith", new Type[] { typeof(string) });  
        private static MethodInfo endsWithMethod = typeof(string).GetMethod("EndsWith", new Type[] { typeof(string) });



    public static Expression GetExpression<T>(ParameterExpression param, ExpressionFilter filter)  
    {  
        MemberExpression member = Expression.Property(param, filter.PropertyName);  
        ConstantExpression constant = Expression.Constant(filter.Value);  
        switch (filter.Comparison)  
        {  
            case Comparison.Equal:  
                return Expression.Equal(member, constant);  
            case Comparison.GreaterThan:  
                return Expression.GreaterThan(member, constant);  
            case Comparison.GreaterThanOrEqual:  
                return Expression.GreaterThanOrEqual(member, constant);  
            case Comparison.LessThan:  
                return Expression.LessThan(member, constant);  
            case Comparison.LessThanOrEqual:  
                return Expression.LessThanOrEqual(member, constant);  
            case Comparison.NotEqual:  
                return Expression.NotEqual(member, constant);  
            case Comparison.Contains:  
                return Expression.Call(member, containsMethod, constant);  
            case Comparison.StartsWith:  
                return Expression.Call(member, startsWithMethod, constant);  
            case Comparison.EndsWith:  
                return Expression.Call(member, endsWithMethod, constant);  
            default:  
                return null;  
        }  
    }  
}

一旦到达该行,return Expression.Call(member, startsWithMethod, constant);它就会抛出以下错误:

> System.TypeInitializationException
  HResult=0x80131534
  Message=The type initializer for 'ExpressionRetriever' threw an exception.
  Source=JobsLedger.API
  StackTrace:
   at JobsLedger.API.ControllerServices.Shared.OrderAndFIlterHelpers.DynamicFilteringHelper.ExpressionRetriever.GetExpression[T](ParameterExpression param, ExpressionFilter filter) in C:\AURELIA\1.0 - JobsLedgerSPA -ASPNET CORE 3.0\JobsLedger.API\ControllerServices\Shared\OrderAndFIlterHelpers\DynamicFilteringHelper.cs:line 84
   at JobsLedger.API.ControllerServices.Shared.OrderAndFIlterHelpers.DynamicFilteringHelper.ConstructAndExpressionTree[T](List`1 filters) in C:\AURELIA\1.0 - JobsLedgerSPA -ASPNET CORE 3.0\JobsLedger.API\ControllerServices\Shared\OrderAndFIlterHelpers\DynamicFilteringHelper.cs:line 39
   at JobsLedger.API.ControllerServices.Shared.ODataFilterAndSort.ParginatedFilteredSorted[T](IQueryable`1 source, String query) in C:\AURELIA\1.0 - JobsLedgerSPA -ASPNET CORE 3.0\JobsLedger.API\ControllerServices\Shared\OrderAndFIlterHelpers\ODataFilterAndSort.cs:line 41
   at JobsLedger.API.ControllerServices.API.App.ClientServices.ClientServices.GetPaginatedClients(String query) in C:\AURELIA\1.0 - JobsLedgerSPA -ASPNET CORE 3.0\JobsLedger.API\ControllerServices\API\App\ClientServices\ClientServices.cs:line 65
   at JobsLedger.API.Controllers.API.App.ClientController.Index(String query) in C:\AURELIA\1.0 - JobsLedgerSPA -ASPNET CORE 3.0\JobsLedger.API\Controllers\API\App\ClientController.cs:line 28
   at Microsoft.Extensions.Internal.ObjectMethodExecutor.Execute(Object target, Object[] parameters)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.SyncActionResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeActionMethodAsync()
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeNextActionFilterAsync()
> 
> Inner Exception 1: AmbiguousMatchException: Ambiguous match found.

如果我注释掉private static MethodInfo containsMethodprivate static MethodInfo endsWithMethod它现在可以工作了。

我发现这篇文章的答案(同类问题)说要使用这个重载,但它已经这样做了。

我怎样才能避免这种情况,以便它可以在不同的方法之间进行选择而不会看到模棱两可的选择?

恩科西

虽然您的问题没有这么具体说,但从提供的堆栈跟踪推断出您正在 .NET Core 环境中运行代码。

请注意,无法在 .NET Framework 环境中重现此错误。

在 .Net Core 中测试时,此行发生错误

private static MethodInfo containsMethod = typeof(string).GetMethod("Contains");  

请注意缺少用于缩小方法匹配范围的参数类型。

通过提供类似的参数类型

private static MethodInfo containsMethod = 
    typeof (string).GetMethod("Contains", new Type[]{typeof (string)});

错误已解决,代码按预期运行。

.Net 工作代码的小提琴

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

ValueError:使用.apply(lambda)时,系列的真值不明确

来自分类Dev

使用python编译pin工具时出错,并得到错误C2872:'UINT32':不明确的符号

来自分类Dev

Python Lambda使用for循环动态添加参数

来自分类Dev

在C ++ 11中使用std :: sort和lambda函数对动态分配的多维C数组进行排序

来自分类Dev

在C ++ 11中使用std :: sort和lambda函数对动态分配的多维C数组进行排序

来自分类Dev

动态选择要使用的 API

来自分类Dev

使用Lambda和Event的C#技巧

来自分类Dev

C ++使用Lambda初始化变量

来自分类Dev

构造函数中使用lambda的C ++类

来自分类Dev

使用 C# Lambda 运算符

来自分类Dev

是否使用动态创建的控件重复Lambda代码?

来自分类Dev

不能使用lambda表达式作为动态参数

来自分类Dev

使用变量常量动态生成lambda表达式

来自分类Dev

如何使用pytest动态参数化生成的测试lambda函数

来自分类Dev

不能使用lambda表达式作为动态参数

来自分类Dev

如何在Lambda表达式中使用动态条件

来自分类Dev

C++ 如何使用 lambda find_if 选择多个对象

来自分类Dev

如何使用动态构建的 lambda 表达式创建和填充动态对象

来自分类Dev

选择要使用的实例方法

来自分类Dev

应用程序动态选择要使用的图标/图像

来自分类Dev

使用动态参数的C#方法重载

来自分类Dev

使用动态参数的C#方法重载

来自分类Dev

使用Mockito的argThat匹配器会导致“方法类型不明确”错误

来自分类Dev

使用Lambda时C ++没有匹配的函数调用进行转换

来自分类Dev

一种方法是不明确时传递的Java lambda表达式

来自分类Dev

使用C#SqlCommand的动态SQL

来自分类Dev

在C#中使用动态类型的优势

来自分类Dev

在C中使用fgets输入动态大小

来自分类Dev

使用“ new”的c ++动态内存分配

Related 相关文章

  1. 1

    ValueError:使用.apply(lambda)时,系列的真值不明确

  2. 2

    使用python编译pin工具时出错,并得到错误C2872:'UINT32':不明确的符号

  3. 3

    Python Lambda使用for循环动态添加参数

  4. 4

    在C ++ 11中使用std :: sort和lambda函数对动态分配的多维C数组进行排序

  5. 5

    在C ++ 11中使用std :: sort和lambda函数对动态分配的多维C数组进行排序

  6. 6

    动态选择要使用的 API

  7. 7

    使用Lambda和Event的C#技巧

  8. 8

    C ++使用Lambda初始化变量

  9. 9

    构造函数中使用lambda的C ++类

  10. 10

    使用 C# Lambda 运算符

  11. 11

    是否使用动态创建的控件重复Lambda代码?

  12. 12

    不能使用lambda表达式作为动态参数

  13. 13

    使用变量常量动态生成lambda表达式

  14. 14

    如何使用pytest动态参数化生成的测试lambda函数

  15. 15

    不能使用lambda表达式作为动态参数

  16. 16

    如何在Lambda表达式中使用动态条件

  17. 17

    C++ 如何使用 lambda find_if 选择多个对象

  18. 18

    如何使用动态构建的 lambda 表达式创建和填充动态对象

  19. 19

    选择要使用的实例方法

  20. 20

    应用程序动态选择要使用的图标/图像

  21. 21

    使用动态参数的C#方法重载

  22. 22

    使用动态参数的C#方法重载

  23. 23

    使用Mockito的argThat匹配器会导致“方法类型不明确”错误

  24. 24

    使用Lambda时C ++没有匹配的函数调用进行转换

  25. 25

    一种方法是不明确时传递的Java lambda表达式

  26. 26

    使用C#SqlCommand的动态SQL

  27. 27

    在C#中使用动态类型的优势

  28. 28

    在C中使用fgets输入动态大小

  29. 29

    使用“ new”的c ++动态内存分配

热门标签

归档