我想形成像
这样的Linq表达式树listInstance.Exists(c=>c.Age=-40)
我已编写代码,但在调用Expression.Call
方法时,它会抛出错误。
我写的代码在这里,
private static string GetExprString<T>(List<Student> listInstance,int valueExpr){
var methodInfo = typeof(List<Student>).GetMethod("Exists",new Type[] { typeof(Predicate<Student>)});
var parameter = Expression.Parameter(typeof(Student), "c");
var masterProperty = Expression.Property(parameter, typeof(Student).GetProperty("Age"));
var slInstance = Expression.Constant(sList);
var expr = Expression.Equal(masterProperty, Expression.Constant(valueExpr));
e1 = Expression.Lambda(expr, new ParameterExpression[] {parameter });
var left = Expression.Call(slInstance, methodInfo, e1);
return string.empty;
}
答案 0 :(得分:1)
目前尚不清楚为什么要使用表达式树而不是仅仅调用将lambda传递给Exists
,但正如您所要求的那样,您可以在不必建立的情况下执行此操作Expression
树本身让编译器为你做了繁重的工作:
static LambdaExpression MakeExistsExpression(int age)
{
Expression<Func<List<Student>, bool>> func= (listInstance) => listInstance.Exists(c => c.Age == age);
return (LambdaExpression)func;
}
现在你可以说:
var func = MakeExistsExpression(40);
var lambda = (Func<List<Student>,bool>)func.Compile();
bool found = lambda(students);
students
是您从某个地方采购的学生名单。
答案 1 :(得分:-1)
listInstance.Exists(c=>c.Age=40)
将其更改为:
listInstance.Exists(c => c.Age == 40)