在我正在进行的一个项目中,我必须使用一个相当奇怪的数据源。我可以给它一个“查询”,它会返回一个 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"
)并将其转换为上述函数调用。另外,如果我可以在那里添加参数会很好,这样我就可以免受注入攻击。顶部的最后一点糖是如果它可以缓存解析结果并在要在另一个对象上重新执行相同的查询时重用它们。
所以我想知道 - 是否有任何现有的解决方案可以用于此,或者我是否必须推出自己的表达式解析器?这并不太复杂,但如果我可以节省两三天的编码时间和大量需要修复的错误,那将是值得的。