扩展成员访问表达式
本文关键字:表达式 访问表 访问 成员 扩展 | 更新日期: 2023-09-27 17:52:39
我有一个使用lambda(语法)创建的类型为Expression<Func<TOwner, object>>
的表达式。它在主体的某个地方有成员访问表达式。我想创建一个表达式,它选择上述表达式结果的另一个属性。
在c#中应该是这样的:
Expression<Func<MyClient, object>> exStartingPath = x => x.Address;
Expression<Func<MyClient, object>> exExtendedPath = ExtendSelection(exStartingPath, "Street");
//exExtendedPath should be equivalent to x => x.Address.Street
ExtendSelection(…)应该如何实现?我应该分解已经存在的表达式,并使用一些遍历技术组成新的表达式,还是有任何API可以只是"追加"成员选择?
只需获取lambda的主体,对其应用成员访问,然后将整个内容包装回新的lambda中。
public static Expression<Func<TSource, TTarget>> ExtendSelection<TSource, TTarget>(
Expression<Func<TSource, TTarget>> expression, string member)
{
var body = Expression.PropertyOrField(expression.Body, member);
return Expression.Lambda<Func<TSource, TTarget>>(body, expression.Parameters);
}