将字符串转换为 LINQ 表达式树以进行动态计算
背景
在某些情况下,有必要针对对象实例评估定义为字符串的逻辑表达式。例如,我们可能有一个代表具有姓名、年龄和体重等属性的人的类,并且我们想要计算“年龄 > 3 AND 体重 > 50”之类的字符串表达式。
过度设计的解决方案提案
最初的想法是使用 ANTLR 从字符串表达式创建 AST。随后将遍历 AST 以动态构造 Func
替代解决方案:动态 LINQ 库
我们可以利用动态 LINQ 库,而不是开发自定义解析器,特别是它的动态查询类。此类提供了一种解析字符串表达式并生成相应的 lambda 表达式的便捷方法。
实现
下面是演示动态 LINQ 用法的代码示例:
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 FavoriteDay { get; set; } } static void Main() { const string filter = "(Person.Age > 3 AND Person.Weight > 50) OR Person.Age < 3"; var personParameter = Expression.Parameter(typeof(Person), "Person"); var lambdaExpression = DynamicExpression.ParseLambda(new[] { personParameter }, null, filter); var person = new Person { Name = "Bob", Age = 30, Weight = 213, FavoriteDay = new DateTime(2000, 1, 1) }; bool match = lambdaExpression.Compile().DynamicInvoke(person); Console.WriteLine(match); } } }
在此示例中,我们使用 Dynamic LINQ 将表达式字符串解析为 lambda 表达式。然后我们编译 lambda 表达式并在 Person 实例上调用它来计算表达式并获得布尔结果。
结论
动态 LINQ 库提供了更简单的针对对象动态评估字符串表达式的解决方案。它消除了开发自定义解析器的需要,并提供了一种从字符串表达式构造 lambda 表达式的便捷机制。
以上是如何根据 C# 中的对象动态计算字符串表达式?的详细内容。更多信息请关注PHP中文网其他相关文章!