2012-09-20 1 views
1

매번 AST를 해석하는 대신 표현식 트리로 실행하기 위해 스크립팅 지원을 사용하여 기존 템플릿 솔루션을 다시 작성하고 있습니다. 기존 스크립트로 작업하십시오.표현 트리, 반환 된 데이터 유형 (문자열, 정수, 부동 소수점)을 전환하는 방법

현재 달성하려는 것은 사실을 테스트 할 솔루션을 만드는 것입니다.

Ex. 널 또는 비어있는 문자열은 0으로 거짓으로 간주되고 절대 값이 0.0001 미만인 십진 값으로 간주됩니다. "true"와 "false"는 대문자와 소문자가 구별되며, 문자열 "null"은 false입니다.

유효한 입력 유형은 float, int, string 및 bool뿐입니다.

표현식 트리로 컴파일 할 수있는 모든 솔루션이 유효하며 개체를 테스트 할 기존 방법이 있지만 외부 메서드를 호출하는 데 좋은 예제를 찾을 수 없습니다.

모든 예제는 상수 값에서 작동하거나 인수를 허용하지 않습니다.

업데이트

나는 "Expression.ABC"방법을 사용하여 트리를 구축하고 있지만 식의 결과의 유형 (문자열, INT, 플로트)을 전환 할 수있는 방법을 자금 문제가있는 나무.

현재 구문은 모든 것을 문자열로 저장하고 연산에 따라 int와 float로 구문 분석하고 실패 할 경우 기본값을 반환합니다.

오류가 발생하지 않도록 설계되었으며 템플릿에 잘못된 구문이 제공된 경우에도 항상 결과를 생성하는 데 성공합니다.

업데이트

예 (100 % 정확하지하지만 현재의 통역을 예시하기 위해)

string Evaluate(Expr e) { 
    switch(Expr.Type) { 
     case "istrue": 
      ExprValue value = Evaluate(Expr.Child); 
      switch(value.Type) { 
       case "String": 
        if(String.IsNullOrWhiteSpace(value.ToString()) || value.ToString().ToLower() == "false" || value.ToString().ToLower() == "null" || value.ToInt() == 0) return false; 

       case "Int": 
        return value.ToInt() != 0; 
       case "Float": 
      } 
    } 
} 

* 업데이트 * 변경 제목

답변

0

해결 방법은 디자인을 변경하는 것이 었습니다.

내 문제는 런타임에 잘못된 시간에 캐스트하려고했으나 표현식 트리가 좋은 방식으로이를 처리 할 수 ​​없다는 것이 었습니다.

강력하게 형식화 된 메서드와 변수 및 명시 적 형변환을 포함하도록 구문 분석기를 완전히 다시 디자인했으며 표현식 트리로 변환하는 것이 훨씬 쉬운 것으로 판명되었습니다.

2

기존의 표현을 호출하는 식 트리를 트리는 정적 메서드를 호출하는 것과 매우 다른 시나리오입니다. 둘 다 가능합니다 - Expression.Call (메소드 호출)과 Expression.Invoke (표현식 트리 호출) 사이의 차이입니다. 경우에 따라 을 을 통해 두 나무를 병합하는 것이 바람직합니다.

switch이 더 복잡합니다. 즉, Expression.Switch이지만, C# 컴파일러는이 표현식에 대한 지원을 포함하지 않으므로 Expression 메소드를 통해 수동으로 작성해야합니다.

당신이하려고하는 것에 대한 구체적인 (그러나 아마도 작동하지 않는) 예제를 추가한다면, 당신의 시나리오에 맞게 편집 할 수 있지만, 현재는 매우 모호합니다.

+0

나는 표현식을 사용하여 나무를 짓고있다. 구문,하지만 식의 결과 형식을 전환 할 수있는 방법을 찾지 못했습니다. Add 또는 Multiply 또는 Concatenation이있는 경우 표현식의 유형 (Add, Multiply, concat)이 아닌 결과의 유형 (int, float, string)을 어떻게 전환합니까? –

+0

오늘 나중에 예제를 만들려고합니다. –

+0

예제로 재 작업하려고 할 때, 내가 원하는 것은 표현식 트리에서 수행하는 것이 거의 불가능하므로 솔루션을 포기하고 새로운 디자인으로 시작했습니다. –