2014-12-16 1 views
4

System.Linq.Expressions.ExpressionVisitor에는 VisitExtension이라는 메서드가 있는데이 메서드는 ExpressionVisitChildren 메서드를 호출하는 것 외에는 아무것도 수행하지 않는 것 같습니다.System.Linq.Expressions.ExpressionVisitor.VisitExtension 및 System.Linq.Expressions.ExpressionType.Extension은 무엇입니까?

protected internal virtual Expression VisitExtension(Expression node) 
{ 
    return node.VisitChildren(this); 
} 

나는 VisitChildren의 기능을 이해합니다. 나는 또한이 가상 구현이 오버라이드 될 수 있다는 것을 이해한다. 그래서 저는 documentation of the method on MSDN에서 모여서 간단히 말하면됩니다 :

확장 표현의 하위를 방문합니다. 특정 확장 노드를 방문하거나 다시 쓰려면이 값을 재정의 할 수 있습니다. 재정의하지 않으면이 메서드는 노드에 자식을 이동할 기회를 제공하는 VisitChildren을 호출합니다. 기본적으로 VisitChildren은 노드를 줄이려고 시도합니다.

이 설명이 도움이되지 않습니다. 구체적으로, 나를 이해할 수 없게 만드는 구절은 이거나 "특정 확장 노드를 다시 작성"입니다.

나머지 부분은 표현식이 하위 표현식으로 축소되거나 분류되는 것과 관련이 있습니다.

또한 동일한 네임 스페이스에는 ExpressionType이라는 열거 형을 사용합니다.이 열거 형은 제가 잘 이해하고있는 목적입니다. 그러나 모든 멤버 중 Extension이라는 멤버가 있는데 현재 알고있는 구문 토큰에 매핑 할 수 없습니다.

documentation in this instance도 역시 불편하지 않을 수 있습니다. 다음과 같이 값 Extension을 설명합니다.

확장 표현식입니다.

두 개의 - ExpressionType.ExtensionExpressionVisitor.VisitExtension -이 관련되어 있음은 명백합니다.

내선은 무엇입니까? 확실히 눈에 띄게 명백한 것처럼 확장 메서드는 이러한 맥락에서 아무 것도 없습니다. 어떤 구문 인공물이 확장자이라는 여기에 해당합니까?

+2

https://www.re-motion.org/blogs/mix/2010/02/18/net-4-0-expression-trees- 확장 표현식 /? –

+0

고마워요, 제 로인. URL이 읽는 방법부터 내 질문에 대한 답변이 매우 좋은 것처럼 보입니다. 그러나 나는 그것을 열 수 없다. 사실 꽤 오랜 시간 동안, 몇 달이 걸릴 수도 있습니다. 다시 모션 프로젝트 웹 사이트를 열 수 없었습니다. 나는 작년 초에 그것을 열 수있었습니다. –

답변

8

이 경우 확장은 모든 종류의 내장 구문을 나타내지 않지만 응용 프로그램에서 정의하고 임의의 의미를 할당 할 수있는 노드에 해당합니다.

이 개념은 응용 프로그램에서 표현식 트리를 조작 할 때 매우 유용합니다. 이러한 확장 노드는 일반 표현식 트리와 완전히 통합 될 수 있습니다.

예를 들어, 회사에서 사용중인 복합 기본 키 유형을 이해하기 위해 Entity Framework의 LINQ를 확장하기 위해 노드 유형이 ExpressionType.ExtensionSystem.Linq.Expressions.Expression의 하위 클래스를 정의했습니다.표현식 방문자가 내 사용자 지정 유형의 노드로 그 복합 키의 모든 모양을 정례화 할 첫 번째 단계에서

  • : 그것은 나를 두 단계 접근 방식을 사용하게 때문에

    확장 발현 유형은 유용 ;

  • 두 번째 단계에서 표현식을 Entity Framework에서 처리 할 수있는 것으로 변환하는 표현식 방문자는 단순히 유형을 확인할 수 있습니다.

예 : 컴포지트 데이터베이스 키 (즉, 두 개의 데이터베이스 열 FirstKey1FirstKey에 대한 FirstKey2가 있었다

from e in table where e.FirstKey == e.SecondKey select e; 

FirstKeySecondKey : 우리가 내가 쓴 LINQ 코드가 있다고 가정 해 봅시다 , 마찬가지로 SecondKey).

그리고 첫 방문자는 기능적으로 변환, CustomKeyExpression 노드에 모두 e.FirstKeye.SecondKey 변환합니다 : 두 아이들이 있다고 나는 EqualExpression를 방문 할 때

from e in table where Key(e.FirstKey1, e.FirstKey2) == Key(e.SecondKey1, e.SecondKey2) select e; 

그리고 두 번째 방문자의

, 내가 확인 할 CustomKeyExpression s를 선택하고 적절한 변환을하십시오 :

from e in table where e.FirstKey1 == e.SecondKey1 && e.FirstKey2 == e.SecondKey2; 
+0

감사합니다. 장. 아주 잘 설명했다. –

관련 문제