首页 > 后端开发 > C++ > 如何根据 C# 中的对象动态计算字符串表达式?

如何根据 C# 中的对象动态计算字符串表达式?

DDD
发布: 2025-01-06 18:01:45
原创
180 人浏览过

How Can I Dynamically Evaluate String Expressions Against Objects in C#?

将字符串转换为 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板