这是原始问题的简化版本。
我有一个叫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 。
这是我目前的想法:
我的问题是我是否完全对此负担过重? 有其他选择吗?
我决定使用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)它!即
Where
.Where(string)
var people = new List<Person> { person }; int match = people.Where(filter).Any();
如果不是这样,写一个解析器(Expression在后台使用)并不会带来太多的负担-我在圣诞节前的通勤火车上写了一个类似的(尽管我不知道消息来源)。
Expression