簡體   English   中英

如何動態創建e.ID == id lambda表達式

[英]How to create e.ID == id lambda expression dynamically

我在堆棧上閱讀了許多有關動態創建lambda表達式的好答案,但是我不能自己做。

我需要通過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 ”部分?

我試圖通過使用注釋來幫助將表達式分解成各個部分,以幫助理解要構建的表達式。

考慮以下...

// 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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM