누군가 대답을 외치기 전에 다음 질문을 읽어보십시오. 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);
}
그렇다면이 방법을 사용하면 실제로 어디에서 사용하게 될까요? 내가 여기서 무엇을 놓치고 있니?
감사합니다.
나는 그것이 addLambdaExpression 자체가 아니라 addLambdaExpression의 전체 트리를 방문 할 것으로 기대했을 것이다. – Jeff
그런 경우에는 ExpressionVisitor에서 사용자 정의 유형을 상속하고 Visit() 메소드에서 NodeType.Lambda를 처리해야합니다. – codekaizen