C # 4.0 : 식 트리와 CodeDom

c# codedom expression-trees

문제

Expression tree와 CodeDom의 차이점은 무엇입니까? 어떤 시나리오에 사용해야합니까?

수락 된 답변

표현식 트리는 AST 와 공통점이 많습니다. 코드에 직접 매핑하지는 않지만 알고리즘을 사용하여 생성하는 것이 매우 쉽습니다. 예를 들어 수식을 파싱하는 경우 :

((a + 2) / b)

그건:

ParameterExpression a = ..., b = ...
var body = Expression.Divide(
    Expression.Add(a, Expression.Constant(2)),
    b);
var lambda = Expression.Lambda(body,a,b); // optionally with generics

사실, 나는 이것을 "방문자"구현을 통해 완전한 expresion을 생성하는 객체와 함께 객체 트리를 만드는 파서를 사용하여 정확하게 수행했습니다. .NET 4.0에서 풍부한 표현 트리 지원을 통해 대부분의 시나리오를 지원하고 필요에 따라 컴파일 할 수 있습니다.

표현식의 또 다른 주요 용도는 런타임에 해체 할 수 있다는 것입니다. 따라서 코드에서 다음을 수행 할 수 있습니다.

Foo(x => x.SomeMethod(1, "abc"));

SomeMethod method-info, 1"abc" 등을 추출합니다.


코드 롬은 코드에 매핑됩니다. 그것은 모든 문장에 대해, 당신이 정규 코드를 작성하는 방법과 매우 비슷합니다. 코드 롬의 가장 보편적 인 사용은 툴링의 일부로 코드 생성입니다. 당신 동적 컴파일을 위해 사용할 수 있지만 솔직히 말해서 더 어렵습니다. 나는 팬이 아니다. 좋은 특징은 코드 돔 트리 여러 언어로 작동한다는 것입니다.


여기서 또 다른 경쟁자는 DynamicMethod 및 / 또는 ILGenerator 여야합니다. 이것은 AST (표현식)에 매핑 되지 않으며 소스 코드 (코드 롬)를 생성하는 데 사용할 수 없지만 MSIL 도구에 대한 전체 액세스를 허용합니다. 물론 스택과 관련하여 생각해야하지만 메타 프로그래밍에 매우 효율적이고 효과적입니다.


ILGenerator 가 너무 하드 코어이고 코드 롬이 PITA이면 다른 옵션은 코드 로서 런타임에 코드 생성하는 것입니다. 그런 다음이를 CSharpCodeProvider 를 통해 전달하여 컴파일하십시오. 이 작업을 수행하는 코어 런타임의 일부가 있습니다 ( XmlSerializer IIRC).


요약하면 다음과 같습니다.

  • 메타 프로그래밍 : ILGenerator 또는 CSharpCodeProvider ; 또한 4.0의 Expression (3.5에서는 매우 제한적 임)
  • AST 처리 : Expression
  • 런타임시 파싱 : Expression
  • 여러 언어로 코드 생성 : 코드 돔

인기 답변

표현식 트리는 표현식을 만드는 데 사용됩니다. 런타임시 소스 코드 작성. CodeDom은 소스 코드를 컴파일하는 데 사용됩니다. 빌드하기 전에 존재해야합니다. 표현식 트리는보다 유연하지만 사용하기가 훨씬 어렵습니다.

응용 프로그램에 스크립팅을 추가하려면 CodeDom을 사용하십시오. 매우 진보 된 리플렉션 등을하고 싶다면, 익스프레션 트리를 사용하십시오. 그러나 권장하지는 않습니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow