为了账号安全,请及时绑定邮箱和手机立即绑定

如何将String转换为其等效的LINQ表达式树?

如何将String转换为其等效的LINQ表达式树?

C#
哈士奇WWW 2019-09-18 14:52:44
这是原始问题的简化版本。我有一个名为Person的类:public class Person {  public string Name { get; set; }  public int Age { get; set; }  public int Weight { get; set; }  public DateTime FavouriteDay { get; set; }}......然后说一个例子:var bob = new Person {  Name = "Bob",  Age = 30,  Weight = 213,  FavouriteDay = '1/1/2000'}我想在我最喜欢的文本编辑器中将以下内容写成字符串 ....(Person.Age > 3 AND Person.Weight > 50) OR Person.Age < 3我想取这个字符串和我的对象实例并评估一个TRUE或FALSE - 即在对象实例上评估一个Func <Person,bool>。这是我目前的想法:在ANTLR中实现基本语法以支持基本比较和逻辑运算符。我想在这里复制Visual Basic优先级和一些功能集:http://msdn.microsoft.com/en-us/library/fw84t893(VS.80).aspx让ANTLR从提供的字符串中创建合适的AST。使用AST并使用Predicate Builder框架动态创建Func <Person,bool>根据需要针对Person实例评估谓词我的问题是我完全过度了吗?任何替代品?编辑:选择解决方案我决定使用Dynamic Linq Library,特别是LINQSamples中提供的Dynamic Query类。代码如下:using System;using System.Linq.Expressions;using System.Linq.Dynamic;namespace ExpressionParser{  class Program  {    public class Person    {      public string Name { get; set; }      public int Age { get; set; }      public int Weight { get; set; }      public DateTime FavouriteDay { get; set; }    }    static void Main()    {      const string exp = @"(Person.Age > 3 AND Person.Weight > 50) OR Person.Age < 3";      var p = Expression.Parameter(typeof(Person), "Person");      var e = System.Linq.Dynamic.DynamicExpression.ParseLambda(new[] { p }, null, exp);      var bob = new Person      {        Name = "Bob",        Age = 30,        Weight = 213,        FavouriteDay = new DateTime(2000,1,1)      };      var result = e.Compile().DynamicInvoke(bob);      Console.WriteLine(result);      Console.ReadKey();    }  }}结果的类型为System.Boolean,在此实例中为TRUE。非常感谢Marc Gravell。包括System.Linq.Dynamic nuget包,文档在这里
查看完整描述

3 回答

?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

请问动态LINQ库帮助吗?特别是,我在考虑作为一个Where条款。如有必要,将它放在列表/数组中只是为了调用.Where(string)它!即


var people = new List<Person> { person };

int match = people.Where(filter).Any();

如果没有,编写一个解析器(Expression在引擎盖下使用)并不是很费力 - 我在圣诞节前的火车通勤中写了一个类似的(虽然我不认为我有源)。


查看完整回答
反对 回复 2019-09-18
  • 3 回答
  • 0 关注
  • 844 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信