我有一个使用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;会员选择?
答案 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);
}