编辑
2025-09-27
C#
00

目录

代码,而无需编译。这在许多场景下都非常有用,例如动态计算公式、规则引擎、脚本执行等。
特点
安装
基本用法
简单表达式
使用变量
自定义函数
使用复杂对象
应用场景
动态计算公式
规则引擎
动态脚本执行
生成 lambda 表达式
结论

Dynamic Expresso 是一个开源的 .NET 库,它允许在运行时解析和执行 C# 代码表达式。通过 Dynamic Expresso,开发者可以动态地评估字符串形式的 C# 代码,而无需编译。这在许多场景下都非常有用,例如动态计算公式、规则引擎、脚本执行等。

特点

  • 动态解析和执行:允许在运行时解析和执行 C# 表达式。
  • 类型安全:支持类型检查,确保表达式的类型安全性。
  • 易于集成:可以轻松地集成到现有的 .NET 应用程序中。
  • 支持自定义函数和变量:可以在表达式中使用自定义函数和变量。

安装

你可以通过 NuGet 包管理器安装 Dynamic Expresso:

Bash
Install-Package DynamicExpresso

或通过 .NET CLI:

Bash
dotnet add package DynamicExpresso

image.png

基本用法

以下是一些基本的用法示例,展示了如何使用 Dynamic Expresso 解析和执行表达式。

简单表达式

C#
using System; using DynamicExpresso; class Program { static void Main() { var interpreter = new Interpreter(); var result = interpreter.Eval("1 + 2 * 3"); Console.WriteLine(result); // 输出: 7 } }

image.png

使用变量

你可以在表达式中使用变量:

C#
using System; using DynamicExpresso; class Program { static void Main() { var interpreter = new Interpreter(); interpreter.SetVariable("x", 10); interpreter.SetVariable("y", 5); var result = interpreter.Eval("x + y"); Console.WriteLine(result); // 输出: 15 } }

自定义函数

你还可以定义自定义函数,并在表达式中使用它们:

C#
using System; using DynamicExpresso; class Program { static void Main() { var interpreter = new Interpreter(); interpreter.SetFunction("Add", (Func<int, int, int>)((a, b) => a + b)); var result = interpreter.Eval("Add(10, 20)"); Console.WriteLine(result); // 输出: 30 } }

使用复杂对象

Dynamic Expresso 还支持在表达式中使用复杂的对象和方法:

C#
using System; using DynamicExpresso; class Program { class Person { public string Name { get; set; } public int Age { get; set; } } static void Main() { var interpreter = new Interpreter(); var person = new Person { Name = "John", Age = 30 }; interpreter.SetVariable("person", person); var result = interpreter.Eval("person.Name + \" is \" + person.Age + \" years old\""); Console.WriteLine(result); // 输出: John is 30 years old } }

应用场景

动态计算公式

在财务、科学计算等领域,经常需要动态地计算公式。Dynamic Expresso 可以帮助你根据用户输入的公式动态计算结果。

C#
using System; using DynamicExpresso; class Program { static void Main() { var interpreter = new Interpreter(); var formula = "x * y + z"; interpreter.SetVariable("x", 5); interpreter.SetVariable("y", 10); interpreter.SetVariable("z", 2); var result = interpreter.Eval(formula); Console.WriteLine(result); // 输出: 52 } }

规则引擎

在业务规则引擎中,规则通常是动态的。Dynamic Expresso 可以用来解析和执行这些规则。

C#
using System; using DynamicExpresso; class Program { static void Main() { var interpreter = new Interpreter(); var rule = "age > 18 && hasLicense"; interpreter.SetVariable("age", 20); interpreter.SetVariable("hasLicense", true); var result = interpreter.Eval(rule); Console.WriteLine(result); // 输出: True } }

动态脚本执行

Dynamic Expresso 可以用来在应用程序中执行用户定义的脚本,从而提供更大的灵活性。

C#
using System; using DynamicExpresso; class Program { static void Main() { var interpreter = new Interpreter(); var script = "Print(\"Hello, \" + name)"; interpreter.SetVariable("name", "World"); interpreter.SetFunction("Print", (Action<string>)(message => Console.WriteLine(message))); interpreter.Eval(script); // 输出: Hello, World } }

生成 lambda 表达式

C#
internal class Program { class User { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } } static void Main() { // 创建一些示例用户数据 var users = new List<User> { new User { Id = 1, Name = "Alice", Age = 30 }, new User { Id = 2, Name = "Bob", Age = 25 }, new User { Id = 3, Name = "Charlie", Age = 35 }, new User { Id = 4, Name = "David", Age = 28 } }; // 将用户数据转换为 IQueryable var queryableUsers = users.AsQueryable(); // 定义用户输入的过滤条件 string userInputCondition = "user.Age > 28"; // 使用 Dynamic Expresso 解析和编译用户输入的条件 var interpreter = new Interpreter(); var lambda = interpreter.ParseAsExpression<Func<User, bool>>(userInputCondition, "user"); // 使用解析后的表达式过滤用户数据 var filteredUsers = queryableUsers.Where(lambda).ToList(); // 输出过滤后的用户数据 foreach (var user in filteredUsers) { Console.WriteLine($"Id: {user.Id}, Name: {user.Name}, Age: {user.Age}"); } } }

结论

Dynamic Expresso 是一个功能强大且灵活的库,适用于各种需要动态解析和执行 C# 表达式的场景。无论是动态计算公式、规则引擎还是脚本执行,Dynamic Expresso 都能提供极大的便利和灵活性。

通过本文的介绍和示例,希望你能更好地理解和应用 Dynamic Expresso。如果有更多需求或疑问,可以查阅 Dynamic Expresso 的 GitHub 仓库 获取更多信息。

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!