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