使用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的主体?
答案 0 :(得分:0)
我不完全确定那里有一个问题,但我认为你回答了这个问题:
LambdaExpression
的正文不包含参数。那些将在expr.Parameters
。如果你需要重新使用lambda的主体,你需要重新创建它。
或者,您可以完整地传递lambda,然后调用InvokeExpression
来调用lambda。
编辑:要回答您的问题,您必须将参数与表达式的主体一起传递。使用的参数必须等同于expr.Parameters
中的参数。您无法将其替换为新创建的ParameterExpression
。