이것은 원래 문제의 단순화 된 버전입니다.
Person이라는 클래스가 있습니다.
public class Person {
public string Name { get; set; }
public int Age { get; set; }
public int Weight { get; set; }
public DateTime FavouriteDay { get; set; }
}
... 인스턴스를 말하십시오.
var bob = new Person {
Name = "Bob",
Age = 30,
Weight = 213,
FavouriteDay = '1/1/2000'
}
좋아하는 텍스트 편집기에서 다음을 문자열 로 작성하고 싶습니다 ....
(Person.Age > 3 AND Person.Weight > 50) OR Person.Age < 3
이 문자열과 객체 인스턴스를 가져 와서 TRUE 또는 FALSE를 평가하고 싶습니다. 즉, 객체 인스턴스에서 Func <Person, bool>을 평가합니다.
내 현재 생각은 다음과 같습니다.
- 기본 비교 및 논리 연산자를 지원하기 위해 ANTLR에서 기본 문법을 구현하십시오. Visual Basic 우선 순위와 일부 기능 집합을 여기에 복사하려고합니다. http://msdn.microsoft.com/en-us/library/fw84t893(VS.80).aspx
- ANTLR이 제공된 문자열에서 적절한 AST를 작성하도록하십시오.
- AST를 걷고 Predicate Builder 프레임 워크를 사용하여 Func <Person, bool>을 동적으로 작성하십시오.
- 필요에 따라 Person 인스턴스에 대한 술어 평가
내 질문은 내가 완전히 오버 베이크 한 것입니까? 대안이 있습니까?
편집 : 선택한 솔루션
동적 Linq 라이브러리, 특히 LINQSamples에 제공된 동적 쿼리 클래스를 사용하기로 결정했습니다.
아래 코드 :
using System;
using System.Linq.Expressions;
using System.Linq.Dynamic;
namespace ExpressionParser
{
class Program
{
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public int Weight { get; set; }
public DateTime FavouriteDay { get; set; }
}
static void Main()
{
const string exp = @"(Person.Age > 3 AND Person.Weight > 50) OR Person.Age < 3";
var p = Expression.Parameter(typeof(Person), "Person");
var e = System.Linq.Dynamic.DynamicExpression.ParseLambda(new[] { p }, null, exp);
var bob = new Person
{
Name = "Bob",
Age = 30,
Weight = 213,
FavouriteDay = new DateTime(2000,1,1)
};
var result = e.Compile().DynamicInvoke(bob);
Console.WriteLine(result);
Console.ReadKey();
}
}
}
결과는 System.Boolean 유형이며이 경우 TRUE입니다.
Marc Gravell에게 감사드립니다.
System.Linq.Dynamic 너겟 패키지, 문서를 여기에 포함 하십시오