如何表达>转换为表达>

问题描述:

予有需要转换的表达如何表达<Func键<T1, bool>>转换为表达<Func键<T2, bool>>

来自:Expression<Func<T1, bool>>

到:Expression<Func<T2, bool>>

由于T1T2可以是不同的,我知道有必要重新创建表达。我希望有一个小方法可以用于多个对象。

+0

OP的要求非常明确。我正在投票重新提出这个问题。 – dasblinkenlight

这在一般情况下是不可能的。下面是一个简单的例子来说明我的观点:

class Apple { 
    public int Weight {get;set;} 
} 
class Orange { 
    public int Diameter {get;set;} 
} 
Expression<Func<Apple,bool>> heavy = a => a.Weight > 250; 

即使你穿越的heavy表达式树,你将无法在AppleWeight转化为相关的Orange什么。

仅在表达式中应用Apple的调用方法会出现类似的问题。

T1上的表达式仅限于T2上的成员的有限情况下,您可以使用ExpressionVisitor类进行转换。覆盖VisitMember,检查MemberExpression node的内容为T1,找到T2中的相应成员,并构造替换Expression。这可能是使用在DTO上构建的表达式来查询后端数据库的可行技巧。