如何动态构建()=> x.prop lambda表达式?

我的代码就像

DepartmentPaperConsumption dto = null; 

然后我有NHibernate QueryOver结果,我想订购它

 result.OrderByAlias(() => dto.TotalColorCopys); 

但我想能够用字符串动态地指定dto任何属性。 我尝试使用动态LINQ,但似乎我无法得到它。 我也试过从头开始构建LambdaExpression – 也没有运气。 我将不胜感激任何帮助。

你可以在这里看到如何构造lambda,但在你的情况下它真的很简单:

 var arg = Expression.Constant(null, typeof(DepartmentPaperConsumption)); var body = Expression.Convert(Expression.PropertyOrField(arg, propertyName), typeof(object)); var lambda = Expression.Lambda>(body); 

棘手的是调用OrderByAlias – 使用MakeGenericMethod可能就是这样,如上面的链接所示。

好好用你写的动态linq,或者使用表达式树http://msdn.microsoft.com/en-us/library/bb397951.aspx

我不认为还有其他解决方案

我自己设法找到了一种方法,但它看起来更像是解决方法,Marc的版本更简单。 我会在测试后立即接受Marc的回答。 inheritance人我的解决方法:

 public class MemberModifier : ExpressionVisitor { public Expression Modify(Expression expression) { return Visit(expression); } protected override Expression VisitMember(MemberExpression node) { var t = typeof (DepartmentPaperConsumption); var memberInfo = t.GetMember("TotalPages")[0]; return Expression.MakeMemberAccess(node.Expression, memberInfo); } } 

然后在代码中

  Expression> exp = () => dto.TotalColorPrints; var mod = new MemberModifier(); var modEx = mod.Modify(exp); result.OrderByAlias((Expression>)modEx) 

MemberModifier只是原始原型,它应该更通用,不依赖于DepartmentConsumption,也没有硬编码的“TotalPages”