扩展成员访问表达式



我有一个使用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);
}

最新更新