2011-01-27 49 views
4

我有這樣的代碼如何動態構建()=> x.prop lambda表達式?

DepartmentPaperConsumption dto = null; 

再後來,我有NHibernate的QueryOver結果,我想訂購

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

,但我希望能夠以指定的dto任何財產動態地用繩子。 我嘗試使用Dynamic LINQ,但似乎我只是無法得到它。 我也試過從頭建立LambdaExpression - 也沒有運氣。 我將不勝感激任何幫助。

+0

你不介意張貼`OrderbyAlias`方法的簽名? – Ani 2011-01-27 12:52:55

+0

如果它有幫助QueryOverOrderBuilder OrderByAlias(表達式>路徑) – 2011-01-27 13:25:56

回答

9

你可以看到如何構建拉姆達here,但它確實是很簡單,你的情況:

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

棘手的事情是調用OrderByAlias - 使用MakeGenericMethod可能的方式,如上面的鏈接。

2

我設法找到了一種方法,但它看起來更多的解決方法,馬克的版本更簡單。我會盡快接受馬克的回答。繼承人我的解決方法:

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<Func<object>> exp =() => dto.TotalColorPrints; 
     var mod = new MemberModifier(); 
     var modEx = mod.Modify(exp); 
     result.OrderByAlias((Expression<Func<object>>)modEx) 

MemberModifier只有原始的原型,它應該是更通用的,不依賴於DepartmentConsumption,沒有硬編碼「總頁數」