【问题标题】:Getting a local variable out of a lambaexpression从lamba表达式中获取局部变量
【发布时间】:2015-03-27 20:41:50
【问题描述】:

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

【问题讨论】:

标签: c# linq-expressions


【解决方案1】:

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

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

输出将是:

(x1, x2) => (x1 == 值(ConsoleApplication4.Program+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));

【讨论】:

    【解决方案2】:

    可以编译执行表达式:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-19
      • 1970-01-01
      • 1970-01-01
      • 2018-12-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多