这是原始问题的简化版本。
我有一个叫人的类:
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 > 。
以下是我目前的想法:
我的问题是,我是不是把它烤过头了? 还有别的选择吗?
我决定使用 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。