Вы можете использовать Body
для доступа к телу первого выражения, затем Expression.Property()
для доступа к свойству и, наконец, Expression.Lambda()
, чтобы объединить все это в лямбду:
Expression<Func<TIn, string>> CreateExpression
(Expression<Func<TIn, TOut>> expr)
{
var barProperty = typeof(Foo).GetProperty("Bar");
return Expression.Lambda<Func<TIn, string>>(
Expression.Property(expr.Body, barProperty), expr.Parameters);
}
Если вы можете использовать LINQKit , это несколько проще (не забудьте using LinqKit;
):
public Expression<Func<TIn, string>> CreateExpression
(Expression<Func<TIn, TOut>> expr)
{
Expression<Func<TIn, string>> tmp = x => expr.Invoke(x).Bar;
return tmp.Expand();
}