从lambaexpression中获取局部变量

时间:2015-03-27 20:41:51

标签: c# linq-expressions

我的问题与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,因为我是一个局部变量。那么我如何提取字段或局部变量的值(不一定是我想要提取的局部变量)?

2 个答案:

答案 0 :(得分:2)

实际上即使i是一个&#34;本地变量&#34;你也可以像引用链接那样做。因为在你的情况下i不再是局部变量。让我们打印我们的lambda:

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

输出将是关于:

  

(x1,x2)=&gt; (x1 ==   值(ConsoleApplication4.Program + LT;&GT; c__DisplayClass0).I)

你可以看到你是否用闭包反编译代码。

所以链接中的代码可以正常工作:

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));

答案 1 :(得分:1)

可以编译并执行表达式:

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