扩展成员访问表达式

时间:2015-06-02 18:50:03

标签: c# expression-trees

我有一个使用lambda(语法)创建的Expression<Func<TOwner, object>>类型的表达式。它在body中的某个地方有成员访问表达式。我想创建一个表达式来选择所提到的表达式的另一个属性。

我对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可以只追加&#39;会员选择?

1 个答案:

答案 0 :(得分:0)

抓住lambda的主体,将成员访问权限应用于该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);
}