2010-07-05 7 views
6

누군가 대답을 외치기 전에 다음 질문을 읽어보십시오. ExpressionVisitor.Visit는 무엇을합니까 <T> 마?

는 .NET 4.0의 ExpressionVisitor의 방법의 목적은 무엇인가 :

public static ReadOnlyCollection<T> Visit<T>(ReadOnlyCollection<T> nodes, Func<T, T> elementVisitor) 

이 방법의 목적에 관한 내 첫번째 추측는 nodes로 지정된 각 트리의 각 노드를 방문 할 것이라고했다 매개 변수를 선택하고 elementVisitor 함수의 결과를 사용하여 트리를 다시 작성하십시오.

이 경우는 그렇지 않습니다. 사실,이 방법은 내가 뭔가를 강하게 의심하는 여기에 놓치지 않는 한, 아무것도하지 않는 것 같습니다 ...

내 코드에서이 방법을 사용하려고했는데 일이 잘 풀리지 않았을 때 예상대로이 메소드를 반영하여 발견했습니다.

public static ReadOnlyCollection<T> Visit<T>(ReadOnlyCollection<T> nodes, Func<T, T> elementVisitor) 
{ 
    T[] list = null; 
    int index = 0; 
    int count = nodes.Count; 
    while (index < count) 
    { 
     T objA = elementVisitor(nodes[index]); 
     if (list != null) 
     { 
      list[index] = objA; 
     } 
     else if (!object.ReferenceEquals(objA, nodes[index])) 
     { 
      list = new T[count]; 
      for (int i = 0; i < index; i++) 
      { 
       list[i] = nodes[i]; 
      } 
      list[index] = objA; 
     } 
     index++; 
    } 
    if (list == null) 
    { 
     return nodes; 
    } 
    return new TrueReadOnlyCollection<T>(list); 
} 

그렇다면이 방법을 사용하면 실제로 어디에서 사용하게 될까요? 내가 여기서 무엇을 놓치고 있니?

감사합니다.

답변

3

식 트리에 aribitrary 변환 함수를 적용하고 변환 된 트리를 반환하거나 변경이없는 경우 원본 트리를 반환하는 편리한 방법처럼 보입니다.

표준 표현식 방문자가 방문자 유형을 제외하고는 다른 기능을 사용하는 패턴과 어떻게 다른지 알 수 없습니다. 사용에 관해서는

: 당신은 당신이 행동을 예상하는 이유 때문에 당신이없는 것보다는 조금 더 수행 생각하는 방법을 설명하지 않습니다

Expression<Func<int, int, int>> addLambdaExpression= (a, b) => a + b; 

// Change add to subtract 
Func<Expression, Expression> changeToSubtract = e => 
{ 
    if (e is BinaryExpression) 
    { 
     return Expression.Subtract((e as BinaryExpression).Left, 
            (e as BinaryExpression).Right); 
    } 
    else 
    { 
     return e; 
    } 
}; 

var nodes = new Expression[] { addLambdaExpression.Body }.ToList().AsReadOnly(); 
var subtractExpression = ExpressionVisitor.Visit(nodes, changeToSubtract); 

.

+1

나는 그것이 addLambdaExpression 자체가 아니라 addLambdaExpression의 전체 트리를 방문 할 것으로 기대했을 것이다. – Jeff

+0

그런 경우에는 ExpressionVisitor에서 사용자 정의 유형을 상속하고 Visit() 메소드에서 NodeType.Lambda를 처리해야합니다. – codekaizen