将变量分配给Expression <func <tsource,bool =“”>&gt; </func <tsource,>

时间:2014-11-19 13:47:22

标签: c# lambda expression-trees

使用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;
    }
  }
}

让我们说我想传递lamdba的身体。得到它:

... 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 设置为 Respondent 类型。

编辑,收到以下错误:

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

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

1 个答案:

答案 0 :(得分:0)

我不完全确定那里有一个问题,但我认为你回答了这个问题:

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

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

编辑:要回答您的问题,您必须将参数与表达式的主体一起传递。使用的参数必须等同于expr.Parameters中的参数。您无法将其替换为新创建的ParameterExpression