2017-09-19 42 views
0

我已經閱讀了關於動態創建lambda表達式的堆棧,這裏有很多很好的答案,但無法自己創建。如何動態創建e.ID == id lambda表達式

我需要從DB選擇實體ID,但我不知道它的類型。只有一個類型的名稱。所以:

var modelType = Assembly.Load("Models").GetTypes().First(t => t.Name == type + "Model"); 
MethodInfo method = typeof(CommonRepository).GetMethod("GetByExpression", 
          BindingFlags.Instance | BindingFlags.Public); 



var arg = Expression.Constant(null, modelType); 
var body = Expression.Convert(Expression.PropertyOrField(arg, "ID"), 
    typeof(int)); 
var lambda = Expression.Lambda<Func<object, bool>>(body); 

var model = method.Invoke(this, new object[] { lambda }); 

var field = modelType.GetProperty("Disable", BindingFlags.Instance); 
field.SetValue(model, false); 

this.marathonRepository.SaveOrUpdate(model); 

我想我的代碼我做了「e.ID」lambda的一部分。如何製作「== id」的一部分?

回答

1

我嘗試將表達式分解爲其部分,使用註釋來幫助理解要構建的表達式。

考慮以下...

// id 
var id = 2; 
var idConstant = Expression.Constant(id); 
// (object e) => ... 
var param = Expression.Parameter(typeof(object)); 
// (object e) => ((modelType)e).ID 
var property = Expression.PropertyOrField(Expression.Convert(param, modelType), "ID")); 
// (object e) => ((modelType)e).ID == id 
var body = Expression.Equal(property, idConstant); 

var lambda = Expression.Lambda<Func<object, bool>>(body, param); 
+0

只是聲明'param'爲'typeof運算(對象)'和'ID'訪問添加一個'轉換(PARAM,modelType)'。而你搞定了。 OP還將'ID'轉換爲'int',這可能是多餘的也可能不是多餘的。 –

+0

@MikeStrobel是的我最初試圖找出他們的意圖是在那裏。 – Nkosi

+0

修正了參數類型,使您可以將lambda表示爲'Func ',而不是'Func ',其中'?'不是靜態已知的。 –