如何表达>转换为表达>
问题描述:
予有需要转换的表达如何表达<Func键<T1, bool>>转换为表达<Func键<T2, bool>>
来自:Expression<Func<T1, bool>>
到:Expression<Func<T2, bool>>
由于T1
和T2
可以是不同的,我知道有必要重新创建表达。我希望有一个小方法可以用于多个对象。
答
这在一般情况下是不可能的。下面是一个简单的例子来说明我的观点:
class Apple {
public int Weight {get;set;}
}
class Orange {
public int Diameter {get;set;}
}
Expression<Func<Apple,bool>> heavy = a => a.Weight > 250;
即使你穿越的heavy
表达式树,你将无法在Apple
的Weight
转化为相关的Orange
什么。
仅在表达式中应用Apple
的调用方法会出现类似的问题。
在T1
上的表达式仅限于T2
上的成员的有限情况下,您可以使用ExpressionVisitor
类进行转换。覆盖VisitMember
,检查MemberExpression node
的内容为T1
,找到T2
中的相应成员,并构造替换Expression
。这可能是使用在DTO上构建的表达式来查询后端数据库的可行技巧。
OP的要求非常明确。我正在投票重新提出这个问题。 – dasblinkenlight