다음 코드 단편을 고려하십시오. 표현식을 계산하는 방법
int sum = 0;
sum = Expression.Evaluate("1+1");
경우 합계의 값 = 2
내가 값을 계산합니다 표현을 할 수 있지만, 내가 표현이 다음 프로그래밍 방식으로 구축 결과를 평가하는 것을 원한다. 내가 어떤 클래스 또는 네임 스페이스를 다루는 지 전혀 알지 못한다. 누구나 나를 도울 수 있습니다.
다음 코드 단편을 고려하십시오. 표현식을 계산하는 방법
int sum = 0;
sum = Expression.Evaluate("1+1");
경우 합계의 값 = 2
내가 값을 계산합니다 표현을 할 수 있지만, 내가 표현이 다음 프로그래밍 방식으로 구축 결과를 평가하는 것을 원한다. 내가 어떤 클래스 또는 네임 스페이스를 다루는 지 전혀 알지 못한다. 누구나 나를 도울 수 있습니다.
당신은 표현의 나무를 사용할 수 있습니다
표현 나무, 각 노드가 표현이다 나무 같은 데이터 구조, 코드를 나타냅니다 예를 들어, 메서드 호출 또는 X와 같은 이진 작동 < y.
표현 트리가 나타내는 코드를 컴파일하고 실행할 수 있습니다.
주 :이 문제는 System.Reflection.Emit
를 사용하여 해결하고 MSIL 직접 작동하지만 결과 코드 작성하고 알아보기 힘들 수 있습니다 . Fast Lightweight Expression Evaluator을 : 약간의 검색 후
도망는 .NET 프레임 워크에 대한 식 파서 및 평가입니다. 은 런타임에에 sqrt (a^2 + b^2)와 같은 문자열 식의 값을 계산할 수 있습니다. 사용자 정의 컴파일러, 강력한 유형의 표현식 언어 및 경량의 코드gen을 사용하여 을 IL에 직접 컴파일합니다. 이는 표현식 평가가 매우 빠르며 효율적으로 임을 의미합니다.
나는이 오래전에 한 번 http://jint.codeplex.com/을 사용했다. 하지만 이것은 단지 프로토 타이핑을위한 것입니다. –
람다를 사용하거나 System.Linq.Expressions 네임 스페이스의 클래스를 사용하여 프로그래밍 방식으로 작성하여 식 트리를 만들 수 있습니다.
자세한 내용은 MSDN을 참조하십시오.
http://ncalc.codeplex.com을 보았습니까?
확장 성이 뛰어나며 (예 : 자체 캐시가 있음) EvaluateFunction/EvaluateParameter 이벤트를 처리하여 런타임에 사용자 지정 함수와 변수를 제공 할 수 있습니다. 예는 구문 분석 할 수 연산 식 :
Expression e = new Expression("Round(Pow(Pi, 2) + Pow([Pi2], 2) + X, 2)");
e.Parameters["Pi2"] = new Expression("Pi * Pi");
e.Parameters["X"] = 10;
e.EvaluateParameter += delegate(string name, ParameterArgs args)
{
if (name == "Pi")
args.Result = 3.14;
};
Debug.Assert(117.07 == e.Evaluate());
또한 유니 코드 & 많은 데이터가 기본적으로 입력 처리합니다. 문법을 바꾸려면 antler file이 함께 제공됩니다. 또한 새로운 기능을로드하기 위해 MEF를 지원하는 포크가 있습니다.
또한 논리 연산자, 날짜/시간 문자열 및 if 문을 지원합니다.
'값을 계산하는식이 있습니다.' 그것은 당신이 제공 한 코드 조각이 예상대로 작동한다는 것을 의미합니까? '나는 그 표현이 프로그램 적으로 구축되기를 원한다. ' 입력 및 출력과 같은 예제를 제공 할 수 있습니까? – Azodious
이 답변은 아마도 당신이 찾고있는 것입니다 : http://stackoverflow.com/a/53852/1106671 –
가능한 복제본 [C# 표현식을 어떻게 동적으로 평가할 수 있습니까?] (http://stackoverflow.com/questions)/53844/how-can-i-evalu-ac-sharp-expression-동적으로). 중복으로 투표를 종료합니다. 그것이 숙제 인 경우 - 도움이 필요한 것에 대한 세부 사항을 표시하십시오. 그렇지 않으면 이전에 이미 다룹니다. –