我想将一些分离的Lambda表达式组合起来,构建出一个最终表达式。
示例类:
class Address {
public string city { get; set; }
public string country { get; set; }
}
class ClassA {
public int Id { get; set; }
public Address address { get; set; }
}
class ClassB {
public int Id { get; set; }
public ClassA objectA { get; set; }
}
每个类都有一个lambda表达式:
Expression<Func<ClassA,bool>> classARule = a =>
a.Id > 1 && a.address.city == "city1" || a.address.country == "us"
Expression<Func<ClassB,bool>> classBRule = b => b.Id == 100
因为ClassB
有一个ClassA
的属性,所以可以创建一个同时包含两个条件的表达式。例如:
// I want to create this expected object at runtime using classARule and classBRule
Expression<Func<ClassB,bool>> expected = b =>
(b.Id == 100) &&
(b.objectA.Id > 1 && b.objectA.address.city == "city1" || b.objectA.address.country == "us")
如果我想在运行时生成预期的表达式,我应该以某种方式将classARule
的参数a
转换为b.objectA
。
问题在于我知道如何组合两个表达式,但不知道如何用其他对象替换a
参数。在这种情况下,是b.objectA
。
更新 - 为了避免更多的混淆
目标是使用classARule
和classBRule
在运行时实现Expression<Func<ClassB,bool>> expected
表达式
a
更改为b.objectA
属性,就像上面的例子一样。我的问题是如何在运行时完成这个操作? - AliReza Sabouri