Если мы предположим public long Id {get;}
для T
, а выражение очень простое, то, возможно, просто создадим его вручную:
var param = Expression.Parameter(typeof (T), "e");
var lambda = Expression.Lambda<Func<T, long>>(
Expression.PropertyOrField(param,"Id"), param);
Посетитель должен работать для более сложных примеров;например:
internal class FlattenInterface<T> : ExpressionVisitor
{
protected override Expression VisitMember(MemberExpression node)
{
if(node.Member.DeclaringType == typeof(T))
{
return Expression.MakeMemberAccess(
node.Expression,
node.Expression.Type.GetMember(node.Member.Name).Single());
}
return base.VisitMember(node);
}
}
и
var direct = (Expression<Func<T, long>>)new FlattenInterface<IEntity>()
.Visit(expr);