2011-09-01 1 views
1

표현식 트리를 구문 분석하는 것에 대한 기본적인 질문이 있습니다.트래버스 할 때 표현식을 구문 분석/방문하는 다른 방법

표현식의 NodeType을 결정하기 위해 if 문을 사용하는 것과 표현식을 전달하는 것과 달리 다른 Visitor 메소드를 사용하는 것의 차이점은 무엇입니까? 이것은 다음과 같은 해석을 참조에 덧붙여서

protected override Expression VisitMember(MemberExpression m) 
    { 
     if (m.Expression.NodeType == ExpressionType.Constant) 
     { 
      //specific code to handle constant 
     } 
    } 

:

protected override Expression VisitMember(MemberExpression m) 
    { 
     if (m.Expression.NodeType == ExpressionType.Constant) 
     { 
      Expression e = (m.Expression as ConstantExpression); 

      this.Visit(e); // dispatches to VisitConstant() ? 
     } 

    } 

대 :

의이 심지어 정확한 전달하는 방법이다

dbContext.Products.Where(x => x.ID == user.ProductID).AsEnumerable() 
// user.FooID is 'MemberExpression' 

무엇 NodeType과 단순히 표현의 유형 사이의 관계는 정확히 무엇입니까? 예를 들어, NodeTypes에는 무시할 수있는 방문자 메서드가있는 것 같습니다. 그게 맞습니까? 다른 사람들과 클래스가보다 일반적이며 BinaryExpression와 같은 하나 이상의 ExpressionType에 관한 상태 MemberInit

+0

첫 번째 버전은 정확할 수 있지만 (나머지 방문자에 따라 다름) 캐스트는 필요하지 않습니다. – svick

답변

1

일부 표현 유형 (수 있으며, 클래스와 연관된 ExpressionType 계수치 간의 일대일 대응 Add, Divide 등).