动态对象

时间:2015-07-03 21:06:54

标签: c# expression expression-trees

让我们假设以下情形:

我有两个班级:

public class Customer
{
    public string Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}


public class Employee
{
    public string Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }
}

然后我可以:

List<Customer> customers = new List<Customer>();

List<Employee> employees = new List<Employee>();

现在我可以这样:

public static List<Employee> GetMajorEmployees(this List<Employee> employees)
{
    return employees.Where(t=>t.Age >= 18).ToList();
}

但是如果不是在代码中运行查询,让用户在UI中定义它并在服务器端运行它,如下所示:

 public static List<T> RunCustomQuery<T>(this List<T> items, dynamic query)
{
    return items.ExecuteQuery(query); // to be implemented
}

其中query是用户在UI中构建并保存在数据库中的实际表达式。

如何在列表上构建动态表达式,并将其作为text或json或xml保存到数据库?

在用户界面上,用户可以选择/构建查询。对于客户列表,查询可以是:

customers.Where(t=>t.FirstName == "Jhon");

此外,我希望能够从动态对象中自动提取属性,因为您可以看到这两个类具有相同的属性,但也有一些不同的属性。

有人能指出我正确的方向吗?

我需要的是像TFS那样:

enter image description here

1 个答案:

答案 0 :(得分:1)

您可以使用Expression。它允许您将表达式树组合在一起并对其进行编译,然后您可以在任何使用lambda的地方使用if作为FuncAction

或者如果你不编译它,你可以解释它或以任何其他方式检查。

有一些开源项目允许你序列化和反序列化表达式,但是我没有使用任何表达式,所以无法提出建议。