我搜索了问题并发现了一些主题,我怀疑错误原因,但我无法弄清楚。
我想构建这个表达式部分:
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))
答案 0 :(得分:0)
问题是Queryable.Select()
不是实例方法。你把它称为VB中的那个,但它不是,这反映在表达式树中。
因此,该行应如下所示:
outerfieldselector = Expression.Lambda(Expression.Call(Nothing, selectMethod, grpindexes, fieldselector), rowParameter)
即使您解决了这个问题,您的代码仍然无效。一些问题是:
MakeGenericMethod()
期望类型参数的类型。这些是TSource
和TResult
,应该是Integer
和Object
。List(Of Integer)
未实施IQueryable
。