我有一组用于某些客户端的数据访问层的类。作为数据访问的一部分,我允许以这种格式发送一组过滤器:
"{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来处理我发送的任何成员路径?带索引的路径不是必需的,但会很好。
答案 0 :(得分:4)
绝对是的!这也是一件非常有趣的事情。
你可以这样做的一种方法是使用LINQ Dynamic Query Library并获取他们在那里的表达式编译器。我的项目MetaSharp中也有类似的东西。
但如果语法或功能与您想要的不完全匹配,您也可以自己动手。一般的想法是,您需要解析字符串并构建表示您正在解析的表达式的表达式树。在.NET中,表达式树对象可以在System.Linq.Expressions中找到。获得树后,可以在其上调用Compile(),然后将其动态编译为委托。尝试阅读有关State Machine和Visitor模式的信息,找出解析上述任意表达的最佳方法。
PS我不建议使用正则表达式!