2010-07-17 3 views

답변

25

표현 트리는 (예를 들어) 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 

는 사실, 내가 오브젝트 트리를 구축 파서를 사용하여 정확히이 를 수행 한 객체 생성과를 "방문자"구현을 통한 완벽한 표현. .NET 4.0에서 풍부한 표현 트리 지원을 통해 대부분의 시나리오를 지원하고 필요에 따라 컴파일 할 수 있습니다.

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

및 등 SomeMethod 방법-정보, 1"abc"를 추출 :

표현의 또 다른 주요 사용은 당신이있을 코드 그렇게 런타임에 그들을 해체 할 수 있다는 것입니다


된 CodeDom은 코드에 매핑됩니다. 그것은 모두 진술 등에 관한 것입니다. 매우은 일반적인 코드 작성 방법과 비슷합니다. 코드 롬의 가장 보편적 인 사용은 툴링의 일부로 코드 생성입니다. 을 사용하여 동적 편집에 사용하지만 솔직히 말하면 더 어렵습니다. 나는 팬이 아니다. 좋은 특징은 코드 롬 트리 일 수 있다는 것입니다.


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


너무 하드 코어, 그리고 된 CodeDom은 피타입니다 다음 다른 옵션은 문자열 같은 코드 의 런타임 생성합니다. 그런 다음 CSharpCodeProvider을 전달하여 컴파일하십시오. 이 작업을 수행하는 핵심 런타임 부분이 있습니다 (XmlSerializer IIRC).그래서


이 요약 :

  • 메타 프로그래밍 : ILGenerator 또는 CSharpCodeProvider; 4.0도 Expression (그러나 이것은 확실히 3.5 제한)
  • 처리 AST : 여러 언어로 Expression
  • 코드 생성 : 코드 DOM
Expression
  • 런타임에 구문 분석
  • 0

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

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