从 lamba 表达式中获取局部变量

Getting a local variable out of a lambaexpression

我的问题和this post (getting the object out of a memberexpression)很相似,但是不同的是我需要从字段中获取。

// how to get 1 from i?
int i = 1;
Expression<Func<int, int, bool>> a = (x1, x2) => x1 == i;
BinaryExpression x = (BinaryExpression)a.Body;
x.Right.//What now?

我不能像链接示例中那样使用 get type.getmember.getvalue,因为 i 是局部变量。那么我将如何提取字段或局部变量的值(不一定是我尝试提取的地方的本地值)?

可以编译和执行表达式:

var data = Expression.Lambda (x.Right).Compile ().DynamicInvoke ();

实际上,即使 i 是 "local variable",您也可以执行与引用 link 相同的操作,因为在您的情况下,i 不再是局部变量。让我们打印我们的 lambda:

Console.WriteLine((Expression<Func<int, int, bool>>) ((x1, x2) => x1 == i));

输出将是关于:

(x1, x2) => (x1 == value(ConsoleApplication4.Program+<>c__DisplayClass0).i)

如果你反编译带有闭包的代码,你会看到完全一样。

因此 link 中的代码将正常工作:

int i = 1;
Expression<Func<int, int, bool>> a = (x1, x2) => x1 == i;
BinaryExpression x = (BinaryExpression)a.Body;

var me = (MemberExpression) x.Right;
var ce = (ConstantExpression) me.Expression;
var fieldInfo = (FieldInfo)me.Member;
Console.WriteLine(fieldInfo.GetValue(ce.Value));