2015-01-25 1 views
1

null 이외의 예를 필요로하고 나는 오류 원인을 의심,하지만 난 그것을 알아낼 수 없습니다.expr. 나무 : static 메소드가 null 인스턴스가 필요, 비 정적 방법은 내가 질문을 검색하고 몇 가지 주제를 발견

나는이 표현 부분을 구축하고 싶습니다 :

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=...

에서 위의 오류를 얻을, 그것은 작동합니다. 하나의 인수 (fieldselector)로 grpindexes에서 Select 메서드를 호출합니다.

무엇이 문제 일 수 있습니까?

감사합니다.

편집 : 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

'grpindexes'란 무엇입니까? 문제를 시연하는 짧지 만 완전한 프로그램을 제공하면 도움이 될 것입니다. (단지 최소한의 콘솔 앱입니다.) –

+0

모든 코드를 여기에 복사하는 것이 너무 길기 때문에 간단한 프로젝트를 추가했습니다. grpindexes는 LINQ 쿼리의 그룹화 된 인덱스를 나타냅니다. – derstauner

+0

실제 코드 일 필요는 없습니다. 문제를 보여주는 짧지 만 대표적인 프로그램. –

답변

0

문제 Queryable.Select() 인스턴스 메소드 없다는 것이다. 당신은 VB에서 하나 인 것처럼 그것을 호출하지만 그렇지 않습니다, 그리고 그것은 표현 나무에 반영됩니다.

그래서 라인은 다음과 같아야합니다

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

을 당신이 당신의 코드가 여전히 작동하지 않습니다 수정하더라도. 문제의 일부는 다음과 같습니다

  1. MakeGenericMethod()는 형식 매개 변수의 유형을 기대하고있다. 여기에는 TSourceTResult이 있으며 이는 IntegerObject이어야합니다.
  2. List(Of Integer)IQueryable을 구현하지 않습니다.
+0

코드를 어떻게 수정해야합니까? MakeGenericMethod에서 유형을 변경했지만 오류가 발생합니다. List (Of Integer)가 IQueryable을 구현하지 않더라도 LINQ 쿼리에서 Select를 호출 할 수 있으므로 Select를 호출 할 수 있습니다. – derstauner

+0

MakeGenericMethod에서 유형을 변경하고 Queryable을 Enumerable로 변경했습니다. – derstauner

+0

@derstauner 네, 일반 콜렉션에서 LINQ는'IQueryable '이 아니라'IEnumerable '을 구현했기 때문에 작동합니다. 이는 Queryable.Select()가 아닌'Enumerable.Select()'를 원한다는 의미입니다. – svick

관련 문제