我有以下代码片段,一切正常,直到我到达失败的最后一行,但有以下异常:
在'System.Collections.Generic.List`1 [System.Linq.Expressions.ConstantExpression]类型上声明的方法'Boolean Contains(System.Linq.Expressions.ConstantExpression)'不能使用'System'类型的实例调用。 GUID“
$str = 'str";
我认为问题是dataProperty是从动态构造的表达式中读取的,该表达式总是Guid,所以当方法执行时,它会将此对象视为Guid,而方法和列表都是List。还有其他方法吗?
答案 0 :(得分:2)
我不太明白你想做什么或为什么,但这是我的猜测如何修复你的代码:
lookupExpression
)的集合是否包含给定的GUID,您要检查集合的表达式GUID (arrayOfValues
)的确如此。这意味着arrayType
错误,应该是:var arrayType = arrayOfValues.Type;
。如果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));
即使Call()
,您的List.Contains()
顺序错误。对于LINQ Contains
,正确的顺序是:
Expression.Call(containsMethod, arrayOfValues, dataProperty)