在运行时评估表达式
我有一个 C# 控制台应用程序项目。
我有一个逻辑表达式作为 nvarchar 存储在数据库中。
例如,存储的表达式为:((34>0)||(US==ES))&& (4312 = 5691)
当我的应用程序运行时,我想检索表达式并对其求值,以便结果为 true 或 false。
我怎样才能在运行时做到这一点?
I have a C# Console Application project.
I have a logical expression that is stored in database as nvarchar.
For example, the stored expression is: ((34 > 0) || (US == ES)) && (4312 = 5691)
While my application running, I want to retrieve the expression and evaluate it so that the result will be true or false.
How can I do it at runtime?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
这是一个相当不寻常的解决方案,涉及 JScript:
使用以下代码创建一个 JScript 类:
将其编译为 DLL:
在您的 C# 项目中,引用 JsMath.dll 和 Microsoft.JScript.dll
现在您可以使用
Eval
方法,如下所示:优点:
缺点:
Here's a rather unusual solution, involving JScript:
Create a JScript class with the following code:
Compile it into a DLL:
In your C# project, reference JsMath.dll and Microsoft.JScript.dll
Now you can use the
Eval
method as follows:Benefits:
Drawbacks:
您可以将表达式解析为 .NET
表达式
类并编译并运行它以获得结果。该类已经支持示例中的所有逻辑操作,尽管它看起来不明确(您以非常相似的方式使用
==
和=
)。不过,您必须编写自己的解析器/转换器。
You can parse the expression into the .NET
Expression
class and compile and run it in order to get the result.The class already supports all the logical operations you have in your example, though it appears to be ambiguous (you are using both
==
and=
in a very similar manner).You will have to write your own parser/converter though.
我从这里编写了 K. Scott Allen 的 JScript 内联 Eval 调用程序的更紧凑、更高效的版本 (https:/ /odetocode.com/articles/80.aspx):
只需像这样使用它:
返回:
5.05050505050505
如果您愿意,您也可以扩展它以传递变量值,例如传递名称和名称的字典。价值观。第一次使用静态类将花费 100-200 毫秒,之后几乎是瞬时的,并且不需要单独的 DLL。如果需要,可以调用 JS.Prepare() 进行预编译以停止初始延迟。
I have written a more compact and efficient version of K. Scott Allen's JScript inline Eval caller from here (https://odetocode.com/articles/80.aspx):
Just use it like this:
Returns:
5.05050505050505
You could extend it to pass in variable values as well if you wanted to, e.g. pass in a dictionary of names & values. First usage of the static class will take 100-200ms, after that its pretty much instantaneous and doesn't require a separate DLL. Call JS.Prepare() to pre compile to stop the initial delay if you want.