【发布时间】:2009-04-22 08:55:16
【问题描述】:
在我正在进行的一个项目中,我必须使用一个相当奇怪的数据源。我可以给它一个“查询”,它会返回一个 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();
本质上,它支持所有标准的东西(布尔运算符、括号、一些函数等),但编写它的语法非常冗长,不适合日常使用。
我想制作一个小解析器来解析给定的表达式(如"Column1 = 123 AND Column2 < 456")并将其转换为上述函数调用。另外,如果我可以在那里添加参数会很好,这样我就可以免受注入攻击。最重要的一点是它是否可以缓存解析结果并在要在另一个对象上重新执行相同的查询时重用它们。
所以我想知道 - 是否有任何现有的解决方案可供我使用,或者我是否必须推出自己的表达式解析器?这不是太复杂,但如果我可以节省两三天的编码时间和大量需要修复的错误,那将是值得的。
【问题讨论】:
标签: c# .net parsing expression-trees