将变量分配给表达式>

本文关键字:bool 变量 TSource Func 表达式 分配 | 更新日期: 2023-09-27 18:30:57

Using Net 4.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;
    }
  }
}

假设我想把兰德巴的身体传来传去。 通过以下方式获取:

... 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

问题是变量x(即受访者)没有定义。 例如,函数表达式 compareXY 可能包含在更大的表达式树中,该表达式树派生自一系列谓词(即代表比较、文字、函数等):

...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 });

基本上,从 compareXY 返回的 lambda 主体必须将变量/参数 x 设置为响应者类型。

编辑,收到以下错误:

 {"variable 'x' of type 'Charting.Models.Respondent' referenced from scope '', 
 but it is not defined"}

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

将变量分配给表达式<Func<TSource,bool>>

我不

完全确定里面有一个问题,但我想你回答了它:

LambdaExpression正文不包含参数。那些将在expr.Parameters.如果您需要重用 lambda 的主体,则需要重新创建它。

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

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