C# 将变量指定给表达式<;Func<;t来源,布尔>&燃气轮机;

C# 将变量指定给表达式<;Func<;t来源,布尔>&燃气轮机;,c#,lambda,expression-trees,C#,Lambda,Expression Trees,使用NET4.5.1 具有以下类别的响应者: namespace Whatever { public class Respondent { public int x { get; set; } public int y { get; set; } public static Expression<Func<Respondent, bool>> compareXY(int value) { return x => ((x.x

使用NET4.5.1

具有以下类别的响应者:

namespace Whatever {
  public class Respondent {
    public int x { get; set; }
    public int y { get; set; }

    public static Expression<Func<Respondent, bool>> compareXY(int value) {
      return x => ((x.x * 100) + x.y) > value;
    }
  }
}

问题是如何将变量x定义到Lambda的主体?

我不完全确定其中是否有问题,但我认为您已经回答了:

LambdaExpression
的主体不包括参数。这些将在
expr.Parameters
中。如果需要重新使用lambda的主体,则需要重新创建它

或者,您可以完整地传递lambda,然后使用
InvokeExpression
调用lambda


编辑:要回答您的问题,必须将参数与表达式体一起传递。使用的参数必须是与
expr.Parameters
中的参数等效的引用。您不能用它代替新创建的
参数表达式

问题到底是什么?@svick,当您在Where子句中删除responder.compareXY表达式时(例如,像ctx.responder.Where(responder.compareXY(4)).Count()),x变量在查询中解析(以某种方式绑定)到responder。我想做的是同样的事情,但是lambda的主体在一个更大的表达式树中的其他地方。您试图创建一个函数,当该函数的主体假设它正在接受一个
响应者时,它会接受一个上下文。你不能那样做。我得到的错误是变量x超出范围。奇怪的是,Func定义了类型(响应者)。在将lambda主体传递回解析表达式树其余部分的代码之前,我不知道如何添加参数(变量定义)。简单的回答是不添加参数。您使用创建时存在的一个。
... some function ...
Type MemberType = typeof(<this class>).Assembly.GetType("Whatever.Respondent");

object[] parameters = new object[] { <populate with integer value> };

var expr = MemberType
  .GetMethod(MemberFunctionName, BindingFlags.Public | BindingFlags.Static)
  .Invoke(null, parameters) as LambdaExpression;

return expr.body
...function returning Expression<Func<Respondent, bool>>...
Expr together = Predicates.Aggregate(
  (prev, next) => new And { Operands = new Expr[] { prev, next}  }
);

Expression composition = together.getExpression(context);  <-- here resolving compareXY
return Expression.Lambda(composition, new ParameterExpression[] { context });
 {"variable 'x' of type 'Charting.Models.Respondent' referenced from scope '', 
 but it is not defined"}