2017-06-01 37 views
-3

心中已經建立的方法來動態構建這樣的表達,下面是我的代碼:如何獲得建立表達式(C => c.user.code ==「XXX」)動態

public static Expression<Func<T, bool>> BuildStringEqualLambda(string propertyName, string propertyValue) 
{ 
    ParameterExpression parameterExp = Expression.Parameter(typeof(T), "type"); 
    Expression propertyExp = Expression.Property(parameterExp, propertyName); 
    Expression right = Expression.Constant(propertyValue); 
    Expression e1 = Expression.Equal(propertyExp, right); 
    return Expression.Lambda<Func<T, bool>>(e1, new ParameterExpression[] { parameterExp }); 
} 

但是,如果拉姆達像

c=>c.user.code == 'XXX' 

,我調用方法如下圖所示:

BuildStringEqualLambda("user.code","XXX"); 

的方法報告錯誤。

所以我的問題是如何獲得建設表達式(C => c.user.code == 'XXX')動態

+2

「該方法無法處理它。」你甚至認爲這是什麼意思? –

回答

1

的相反:

ParameterExpression parameterExp = Expression.Parameter(typeof(T), "type"); 
Expression propertyExp = Expression.Property(parameterExp, propertyName); 

你需要去每個更深物業:

ParameterExpression parameterExp = Expression.Parameter(typeof(T), "type"); 
Expression propertyExp = parameterExp; 
foreach (var property in propertyName.Split('.')) { 
    propertyExp = Expression.PropertyOrField(propertyExp, property); 
} 
+0

propertyExp的初始值是什麼? – user2155362

+0

@ user215536​​2我更新了我的答案 –