문자열 표현식을 LINQ 표현식 트리로 구문 분석
객체 인스턴스에 대해 문자열로 표현된 논리적 조건을 평가하려면 체계적인 접근 방식이 필요합니다. ANTLR을 사용하여 사용자 정의 문법과 AST를 구현하는 것은 실행 가능한 옵션이지만 지나치게 복잡한 솔루션이 될 수 있습니다. 다음은 몇 가지 대체 접근 방식입니다.
동적 LINQ 라이브러리
동적 LINQ 라이브러리는 문자열 표현식을 표현식 트리로 동적으로 구문 분석하는 편리한 방법을 제공합니다. 람다 식을 가져와서 조건을 평가하는 데 사용할 수 있는 컴파일된 식을 반환하는 DynamicExpression.ParseLambda라는 메서드를 제공합니다.
var p = Expression.Parameter(typeof(Person), "Person"); var e = System.Linq.Dynamic.DynamicExpression.ParseLambda(new[] { p }, null, exp);
Expression Tree Assembly
Expression 클래스를 사용하여 표현식 트리를 수동으로 조합할 수도 있습니다. 이 접근 방식을 사용하려면 LINQ 식 트리 구조에 대한 더 깊은 이해가 필요하지만 식 생성 프로세스를 더 효과적으로 제어할 수 있습니다.
var ageExpr = Expression.GreaterThan(Expression.Property(p, "Age"), Expression.Constant(3)); var weightExpr = Expression.GreaterThan(Expression.Property(p, "Weight"), Expression.Constant(50)); var andExpr = Expression.AndAlso(ageExpr, weightExpr); var ageLessThanExpr = Expression.LessThan(Expression.Property(p, "Age"), Expression.Constant(3)); var orExpr = Expression.OrElse(andExpr, ageLessThanExpr);
간단한 문자열 평가
If 표현식 문자열은 상대적으로 간단하므로 리플렉션과 문자열 구문 분석을 조합하여 평가할 수 있습니다. 이 접근 방식은 유연성은 떨어지지만 제한된 시나리오에 적합할 수 있습니다.
var filter = "(Person.Age > 3) AND (Person.Weight > 50) OR (Person.Age < 3)"; var result = bob.GetType().GetProperty("Age").GetValue(bob) > 3 && bob.GetType().GetProperty("Weight").GetValue(bob) > 50 || bob.GetType().GetProperty("Age").GetValue(bob) < 3;
가장 좋은 접근 방식은 표현식의 복잡성과 구문 분석에 필요한 유연성 수준에 따라 다릅니다. 간단한 시나리오의 경우 간단한 문자열 평가 또는 반영 기반 방법으로 충분할 수 있습니다. 그러나 더 복잡한 식과 동적 구문 분석 요구 사항이 있는 경우 동적 LINQ 라이브러리를 활용하거나 식 트리를 수동으로 조합하는 것이 좋습니다.
위 내용은 문자열 식을 LINQ 식 트리로 효율적으로 구문 분석하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!