将过滤字符串转换为C#委托

时间:2011-03-16 21:51:10

标签: c# linq parsing reflection delegates

我有一组用于某些客户端的数据访问层的类。作为数据访问的一部分,我允许以这种格式发送一组过滤器:

"{Member[.Member....]}{Operator}{Value}"

我想将这些字符串转换为委托,以便在LINQ查询中使用,如下所示:

.Where([delegate returned by a factory])

这是一个更具体的例子:

IEnumerable<Parent> parents = GetSomeParents();
string filter = "Child.Id=5";
var expression = FilterFactory<Parent>.GetExpression(filter);

parents = parents.Where(expression);

表达式将包含委托:parent => parent.Child.Id == 5

有没有办法使用反射以通用方式构造FilterFactory来处理我发送的任何成员路径?带索引的路径不是必需的,但会很好。

1 个答案:

答案 0 :(得分:4)

绝对是的!这也是一件非常有趣的事情。

你可以这样做的一种方法是使用LINQ Dynamic Query Library并获取他们在那里的表达式编译器。我的项目MetaSharp中也有类似的东西。

但如果语法或功能与您想要的不完全匹配,您也可以自己动手。一般的想法是,您需要解析字符串并构建表示您正在解析的表达式的表达式树。在.NET中,表达式树对象可以在System.Linq.Expressions中找到。获得树后,可以在其上调用Compile(),然后将其动态编译为委托。尝试阅读有关State Machine和Visitor模式的信息,找出解析上述任意表达的最佳方法。

PS我不建议使用正则表达式!