在我正在进行的项目中,我必须使用一个相当奇怪的数据源。我可以给它一个“查询”,它会返回一个 DataTable。但是查询的不是传统的字符串。它更像是...一组定义我想要的标准的方法调用。沿着这些线的东西:
var tbl = MySource.GetObject("TheTable");
tbl.AddFilterRow(new FilterRow("Column1", 123, FilterRow.Expression.Equals));
tbl.AddFilterRow(new FilterRow("Column2", 456, FilterRow.Expression.LessThan));
var result = tbl.GetDataTable();
本质上,它支持所有标准的东西( bool 运算符、括号、一些函数等),但是编写它的语法非常冗长,不适合日常使用。
我想制作一个小解析器来解析给定的表达式(如 "Column1 = 123 AND Column2 < 456"
)并将其转换为上述函数调用。另外,如果我可以在那里添加参数就好了,这样我就可以免受注入(inject)攻击。顶部的最后一小块糖是它是否可以缓存解析结果并在要在另一个对象上重新执行相同查询时重用它们。
所以我想知道 - 是否有任何现有的解决方案可供我使用,或者我是否必须推出自己的表达式解析器?它并不太复杂,但如果我可以节省两三天的编码时间和大量需要修复的错误,那将是值得的。
最佳答案
试用 Irony .尽管缺少文档,但这些示例可以帮助您快速启动和运行。 Irony 是一个用于解析代码和构建抽象语法树的项目,但您可能必须编写一些逻辑才能创建适合您需要的表单。 DLR可能是对此的补充,因为它可以从抽象语法树动态生成/执行代码(它用于 IronPython 和 IronRuby)。两者应该是很好的一对。
哦,它们都是一流的 .NET 解决方案和开源。
关于C#:如何将任意字符串解析为表达式树?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/776265/