表达式树产生参数异常

时间:2015-04-28 15:53:07

标签: c# linq expression-trees

我有以下代码片段,一切正常,直到我到达失败的最后一行,但有以下异常:

  

在'System.Collections.Generic.List`1 [System.Linq.Expressions.ConstantExpression]类型上声明的方法'Boolean Contains(System.Linq.Expressions.ConstantExpression)'不能使用'System'类型的实例调用。 GUID“

$str = 'str";

我认为问题是dataProperty是从动态构造的表达式中读取的,该表达式总是Guid,所以当方法执行时,它会将此对象视为Guid,而方法和列表都是List。还有其他方法吗?

1 个答案:

答案 0 :(得分:2)

我不太明白你想做什么或为什么,但这是我的猜测如何修复你的代码:

  1. 您不想检查您的 GUID表达式lookupExpression)的集合是否包含给定的GUID,您要检查集合的表达式GUID arrayOfValues)的确如此。这意味着arrayType错误,应该是:var arrayType = arrayOfValues.Type;
  2. 如果arrayOfValues实际上是数组,则无法使用Contains实例方法,因为数组没有。

    您可以使用LINQ Contains,也可以将arrayOfValues更改为代表List<Guid>而非Guid[]的表达式。我选择了LINQ。

    要获取LINQ Contains方法,可以使用LINQ:

    var containsMethod = typeof(Enumerable).GetMethods()
        .Single(m => m.Name == "Contains" && m.GetParameters().Length == 2)
        .MakeGenericMethod(typeof(Guid));
    
  3. 即使Call(),您的List.Contains()顺序错误。对于LINQ Contains,正确的顺序是:

    Expression.Call(containsMethod, arrayOfValues, dataProperty)