C# 中的动态代码执行:Dynamic Expresso 使用指南

作者:微信公众号:【架构师老卢】
9-17 18:36
168

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

特征

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

安装

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

Install-Package DynamicExpresso

或通过 .NET CLI:

dotnet add package DynamicExpresso

基本用法

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

简单表达式

using System;  
using DynamicExpresso;  
  
class Program  
{  
    static void Main()  
    {  
        var interpreter = new Interpreter();  
        var result = interpreter.Eval("10 + 2 * 3");  
        Console.WriteLine(result); // Output: 16  
    }  
}

使用变量

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

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); // Output: 15  
    }  
}

自定义函数

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

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); // Output: 30  
    }  
}

使用复杂对象

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

using System;  
using DynamicExpresso;  
  
class Program  
{  
    class Student  
    {  
        public string Name { get; set; }  
        public int Age { get; set; }  
    }  
  
    static void Main()  
    {  
        var interpreter = new Interpreter();  
        var student = new Student { Name = "John", Age = 20 };  
        interpreter.SetVariable("student", student);  
        var result = interpreter.Eval("student.Name + \" is \" + student.Age + \" years old\"");  
        Console.WriteLine(result); // Output: John is 20 years old  
    }  
}

应用场景

公式的动态计算

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

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); // Output: 52  
    }  
}

规则引擎

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

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); // Output: True  
    }  
}

动态脚本执行

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

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); // Output: Hello, World  
    }  
}

生成 Lambda 表达式

internal class Program  
{  
    class User  
    {  
        public int Id { get; set; }  
        public string Name { get; set; }  
        public int Age { get; set; }  
    }  
  
    static void Main()  
    {  
        // Create some example user data  
        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 }  
        };  
  
        // Convert user data to IQueryable  
        var queryableUsers = users.AsQueryable();  
  
        // Define the filtering condition entered by the user  
        string userInputCondition = "user.Age > 28";  
  
        // Use Dynamic Expresso to parse and compile the user-entered condition  
        var interpreter = new Interpreter();  
        var lambda = interpreter.ParseAsExpression<Func<User, bool>>(userInputCondition, "user");  
  
        // Filter user data using the parsed expression  
        var filteredUsers = queryableUsers.Where(lambda).ToList();  
  
        // Output filtered user data  
        foreach (var user in filteredUsers)  
        {  
            Console.WriteLine($"Id: {user.Id}, Name: {user.Name}, Age: {user.Age}");  
        }  
    }  
}

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

相关留言评论
昵称:
邮箱:
阅读排行