EXPR。 tree:静态方法需要null实例,非静态方法需要非null实例

时间:2015-01-25 09:09:00

标签: vb.net linq expression-trees

我搜索了问题并发现了一些主题,我怀疑错误原因,但我无法弄清楚。

我想构建这个表达式部分:

Function(row) groupedindexes.Select(
    Function(grpindex) row(grpindex))

我已经用这个构建了Function(grpindex) row(grpindex)部分:

Dim fieldselector As Expressions.LambdaExpression
fieldselector = Expression.Lambda(Expression.ArrayAccess(rowParameter, indexParameter), indexParameter)

声明是:

Dim rowParameter = Expression.Parameter(GetType(Object()), "Row")
Dim indexParameter = Expression.Parameter(GetType(Integer), "grpindex")

现在,我想像这样构建Select部分:

Dim outerfieldselector As Expressions.LambdaExpression
outerfieldselector = Expression.Lambda(Expression.Call(grpindexes, selectMethod, fieldselector), rowParameter)

声明是:

Dim grpindexes As Expression = Expression.Constant(groupedindexes, GetType(System.Collections.Generic.List(Of Integer)))
Dim selectMethod = GetType(Queryable).GetMethods(BindingFlags.Public Or BindingFlags.Static).First(Function(m) m.Name = "Select").MakeGenericMethod(GetType(Object), GetType(System.Func(Of Integer, Object)))

groupedindexes是正常的List(Of Integer)

在运行时,我在第outerfieldselector=...

处收到上述错误

在我看来,它应该有效。我使用一个参数(Select)在grpindexes上调用fieldselector方法。

可能是什么问题?

感谢。

编辑:可以通过以下链接下载示例项目:http://www.filedropper.com/exptree

编辑II:

这是一个简单的简短控制台应用程序项目:

Imports System.Reflection
Imports System.Linq.Expressions
Module Module1
    Dim rowParameter = Expression.Parameter(GetType(Object()), "Row")
    Dim indexParameter = Expression.Parameter(GetType(Integer), "grpindex")
    Dim expr As Expression = Nothing
    Dim groupedindexes As New List(Of Integer)
    Dim grpindexes As Expression = Expression.Constant(groupedindexes, GetType(System.Collections.Generic.List(Of Integer)))
    Dim selectMethod = GetType(Queryable).GetMethods(BindingFlags.Public Or BindingFlags.Static).First(
        Function(m) m.Name = "Select").MakeGenericMethod(GetType(Object), GetType(System.Func(Of Integer, Object)))
    Dim fieldselector As Expressions.LambdaExpression
    Dim outerfieldselector As Expressions.LambdaExpression

    Sub Main()
        groupedindexes.Add(0)
        groupedindexes.Add(1)
        groupedindexes.Add(2)
        fieldselector = Expression.Lambda(Expression.ArrayAccess(rowParameter, indexParameter), indexParameter)
        outerfieldselector = Expression.Lambda(Expression.Call(grpindexes, selectMethod, fieldselector), rowParameter)
    End Sub
End Module

编辑3:

我想,我是在svick的帮助下得到的。

Dim selectMethod = GetType(Enumerable).GetMethods(BindingFlags.Public Or BindingFlags.Static).First(Function(m) m.Name = "Select").MakeGenericMethod(GetType(Integer), GetType(Object))

1 个答案:

答案 0 :(得分:0)

问题是Queryable.Select()不是实例方法。你把它称为VB中的那个,但它不是,这反映在表达式树中。

因此,该行应如下所示:

outerfieldselector = Expression.Lambda(Expression.Call(Nothing, selectMethod, grpindexes, fieldselector), rowParameter)

即使您解决了这个问题,您的代码仍然无效。一些问题是:

  1. MakeGenericMethod()期望类型参数的类型。这些是TSourceTResult,应该是IntegerObject
  2. List(Of Integer)未实施IQueryable