在我正在处理的项目中,我需要使用一种相当奇怪的数据源。我可以给它一个“查询”,然后它会返回给我一个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"),并将其转换为上面的函数调用。此外,如果我可以添加参数,那么我就能够避免受到注入攻击。最后一点小甜头是,如果它可以缓存解析结果,并在另一个对象上重新执行相同的查询时重复使用它们,那就太好了。
因此,我想知道 - 是否有任何现有的解决方案可供我使用,还是我必须自己编写表达式解析器?虽然不是太复杂,但如果我可以节省两三天的编程时间和大量要修复的错误,这将是值得的。