您正在寻找的是能够表达表达式的能力,就像您可以构成函数一样:
public static expression<Func<T, TResult>> Compose<T, TIntermediate, TResult>( this expression<Func<T, TIntermediate>> first, expression<Func<TIntermediate, TResult>> second){ return expression.Lambda<Func<T, TResult>>( second.Body.Replace(second.Parameters[0], first.Body), first.Parameters[0]);}这依靠以下方法将一个表达式的所有实例替换为另一个:
public class ReplaceVisitor:expressionVisitor{ private readonly expression from, to; public ReplaceVisitor(expression from, expression to) { this.from = from; this.to = to; } public override expression Visit(expression ex) { if(ex == from) return to; else return base.Visit(ex); } }public static expression Replace(this expression ex, expression from, expression to){ return new ReplaceVisitor(from, to).Visit(ex);}现在,您可以使用一个表达式来选择一个属性:
expression<Func<Customer, object>> propertySelector = cust => cust.Name;
还有一个从模型中选择该对象的表达式:
expression<Func<CustomerModel, Customer>> modelSelector = model => model.Customer;
并组成它们:
expression<Func<Customer, object> magic = modelSelector.Compose(propertySelector);



