我需要转换表达式
来自:Expression<Func<T1, bool>>
收件人:Expression<Func<T2, bool>>
由于T1
和T2
可能不同,我知道需要重新创建表达式。我希望有一个小方法,我可以重用多个对象。
答案 0 :(得分:2)
在一般情况下,这是不可能的。这是一个简单的例子来说明我的观点:
class Apple {
public int Weight {get;set;}
}
class Orange {
public int Diameter {get;set;}
}
Expression<Func<Apple,bool>> heavy = a => a.Weight > 250;
即使您遍历heavy
的表达式树,也无法将Weight
的{{1}}转换为与Apple
相关的任何内容。
调用仅适用于表达式中Orange
的方法会产生类似的问题。
在有限的情况下,Apple
上的表达仅限于T1
上的成员,您可以使用ExpressionVisitor
类进行转换。覆盖VisitMember
,查看T2
的{{1}}内容,在MemberExpression node
中找到相应的成员,然后构建替换T1
。这可能是使用在DTO上构建的表达式查询后端数据库的可行技巧。