【问题标题】:Expression tree yields Argument exception表达式树产生参数异常
【发布时间】:2015-04-28 15:53:06
【问题描述】:

我有以下一段代码,一切正常,直到我到达最后一行失败并出现以下异常:

在类型“System.Collections.Generic.List`1[System.Linq.Expressions.ConstantExpression]”上声明的方法“Boolean Contains(System.Linq.Expressions.ConstantExpression)”不能使用“System.指导'

var filter = new List<SomeObj> { new SomeObj { Id = "<guid-string>" }};

var lookupExpression = filter.SetOperand.Select(x => Expression.Constant(Guid.Parse(x.Id))).ToList();
var arrayOfValues = Expression.NewArrayInit(typeof(Guid), lookupExpression);
var arrayType = lookupExpression.GetType();
var containsMethod = arrayType.GetMethod("Contains");

var right = Expression.Call(dataProperty, containsMethod, arrayOfValues);

我认为问题在于 dataProperty 是从一个动态构造的表达式中读取的,该表达式始终是一个 Guid,所以当方法执行时,它将这个对象视为一个 Guid,而方法和列表都是 List。有没有其他方法可以解决这个问题?

【问题讨论】:

  • Guid 数据类型不能为const,见:stackoverflow.com/questions/4926573/…
  • 你不能打电话给filter.Contains(guid)。但是filter.Any(f =&gt; f.Id == guid).
  • @abatishchev 你怎么推荐我把它转换成 List filter.SetOperand.Select(x => Expression.Constant(Guid.Parse(x.Id)));这是 Epression.NewArrayInit 所必需的。还是您推荐一种完全不同的方法?
  • SomeObj.id的类型是什么?是包含 guid 还是 System.Guid 的字符串?
  • 您也可以使用filter.Select(f =&gt; f.id).Contains(guid),但我认为效率会降低。

标签: c# linq expression-trees


【解决方案1】:

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

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

    您可以使用 LINQ Contains,或将 arrayOfValues 更改为表示 List&lt;Guid&gt; 而不是 Guid[] 的表达式。我选择了 LINQ。

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

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

    Expression.Call(containsMethod, arrayOfValues, dataProperty)
    

【讨论】:

  • 我强烈怀疑会出现这种情况,因为我已经将我的代码四处乱窜,几乎看起来像你这里的一样,但这已经回答了我所有的唠叨问题。我进去后试试。谢谢
猜你喜欢
  • 2013-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-19
相关资源
最近更新 更多