从 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));
我的问题和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));