这是原始问题的简化版本。
我有一个名为 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。
以下是我目前的想法:
我的问题是我完全烤过头了吗? 有什么选择吗?
我决定使用动态 Linq 库,特别是 LINQSamples 中提供的动态查询类。
下面的代码:
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)它!IE
Where
.Where(string)
var people = new List<Person> { person }; int match = people.Where(filter).Any();
如果没有,写一个解析器(Expression在引擎盖下使用)并不是很费力 - 我在圣诞节前的火车通勤中写了一个类似的(虽然我不认为我有源代码)......
Expression