将变量分配给表达式>
本文关键字: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 的主体?
我不
完全确定里面有一个问题,但我想你回答了它:
LambdaExpression
正文不包含参数。那些将在expr.Parameters
.如果您需要重用 lambda 的主体,则需要重新创建它。
或者,您可以完整地传递 lambda,然后调用 using InvokeExpression
来调用 lambda。
编辑:要回答您的问题,您必须将参数与表达式的主体一起传递。使用的参数必须是与 expr.Parameters
中的内容等效的引用。您不能将其替换为新创建的ParameterExpression
。