C#中是否存在类似VBA Application.Eval()的内置函数?
C# 中替代 VBA Application.Eval() 的方案
C# 没有直接对应 VBA Application.Eval() 的内置函数,但可以通过以下几种方式实现相同的表达式求值功能,支持数值比较、逻辑运算及文本比较:
1. 使用 Roslyn 脚本引擎
Roslyn 是官方的 .NET 代码分析引擎,支持动态编译并执行 C# 表达式,能完美处理你需要的各种运算场景。
首先需要安装 NuGet 包 Microsoft.CodeAnalysis.CSharp.Scripting,然后使用以下代码:
using Microsoft.CodeAnalysis.CSharp.Scripting; using System.Threading.Tasks; // 求值示例 bool evalResult = await CSharpScript.EvaluateAsync<bool>("4 > 2 && 10 != 62"); // 返回 true evalResult = await CSharpScript.EvaluateAsync<bool>("\"True\" == \"False\" && (4 == 2 || 4 == 4)"); // 返回 false evalResult = await CSharpScript.EvaluateAsync<bool>("\"True\" == \"True\" && (4 == 2 || 4 == 4)"); // 返回 true
注意:需要将 VBA 语法转换为 C# 语法,比如 AND 替换为 &&,<> 替换为 !=,字符串用双引号包裹。
2. 正确使用 NCalc
你提到 NCalc 仅支持数值运算,但实际上它完全支持字符串比较和逻辑运算,语法更接近 VBA,不需要大量修改原有表达式:
using NCalc; // 求值示例 Expression expr = new Expression("4 > 2 AND 10 != 62"); bool evalResult = (bool)expr.Evaluate(); // 返回 true expr = new Expression("'True' = 'False' AND (4 = 2 OR 4 = 4)"); evalResult = (bool)expr.Evaluate(); // 返回 false expr = new Expression("'True' = 'True' AND (4 = 2 OR 4 = 4)"); evalResult = (bool)expr.Evaluate(); // 返回 true
NCalc 支持直接解析类似 VBA 风格的表达式,包括字符串单引号、AND/OR 逻辑运算符,以及嵌套括号。
3. 自定义简单表达式解析器(不推荐复杂场景)
如果不想依赖第三方库,可针对简单表达式写自定义解析逻辑,比如用正则拆分表达式片段,逐段比较求值。但这种方式仅适合逻辑简单的场景,嵌套逻辑、复杂运算处理起来会非常繁琐,维护成本高。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

