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

这是原始问题的简化版本。

我有一个叫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

这是我目前的想法:

  1. 在ANTLR中实现基本语法,以支持基本比较和逻辑运算符。我正在考虑在此处复制Visual Basic优先级和某些功能集:http : //msdn.microsoft.com/zh-cn/library/fw84t893(VS.80).aspx
  2. 让ANTLR从提供的字符串中创建合适的AST。
  3. 遍历AST并使用Predicate Builder框架动态创建Func
  4. 根据需要评估Person实例的谓词


回答:

我决定使用Dynamic Linq库,尤其是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软件包和文档

回答:

将在动态LINQ库在这里帮助吗?特别是,我正在考虑将其作为Where子句。如有必要,将其放在列表/数组中只是为了调用.Where(string)它!即

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

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

如果不是这样,写一个解析器(Expression在后台使用)并不会带来太多的负担-我在圣诞节前的通勤火车上写了一个类似的(尽管我不知道消息来源)。

以上是 如何将字符串转换为其等效的LINQ表达式树? 的全部内容, 来源链接: utcz.com/qa/417416.html

回到顶部