如何动态创建 e.ID == id lambda 表达式
How to create e.ID == id lambda expression dynamically
我已经在堆栈上阅读了很多关于动态创建 lambda 表达式的很好的答案,但我不能自己写。
我需要通过 ID
从数据库中 select 实体,但我事先不知道它的类型。只有一种类型的名称。所以:
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);
我已经在堆栈上阅读了很多关于动态创建 lambda 表达式的很好的答案,但我不能自己写。
我需要通过 ID
从数据库中 select 实体,但我事先不知道它的类型。只有一种类型的名称。所以:
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);