C# 从lambaexpression中获取局部变量

C# 从lambaexpression中获取局部变量,c#,linq-expressions,C#,Linq Expressions,我的问题非常类似于,但不同的是,我需要从一个领域获得它 // 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? //如何从i获取1? int i=1; 表达式a=(x1,x2)=>x1==i; 二进制表达

我的问题非常类似于,但不同的是,我需要从一个领域获得它

// 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?
//如何从i获取1?
int i=1;
表达式a=(x1,x2)=>x1==i;
二进制表达式x=(二进制表达式)a.Body;
x、 对,现在怎么办?

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

可以编译并执行表达式:

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

可以编译和执行表达式:

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

可以编译和执行表达式:

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

可以编译和执行表达式:

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

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

Console.WriteLine((Expression<Func<int, int, bool>>) ((x1, x2) => x1 == i));
Console.WriteLine((表达式)((x1,x2)=>x1==i));
输出将是关于:

(x1,x2)=>(x1== 值(控制台应用程序4.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));
inti=1;
表达式a=(x1,x2)=>x1==i;
二进制表达式x=(二进制表达式)a.Body;
var me=(MemberExpression)x.右;
var ce=(ConstantExpression)me.Expression;
var fieldInfo=(fieldInfo)me.Member;
Console.WriteLine(fieldInfo.GetValue(ce.Value));

事实上,即使
i
是一个“局部变量”,您也可以像在引用链接中那样做,因为在您的情况下
i
不再是局部变量。让我们打印我们的lambda:

Console.WriteLine((Expression<Func<int, int, bool>>) ((x1, x2) => x1 == i));
Console.WriteLine((表达式)((x1,x2)=>x1==i));
输出将是关于:

(x1,x2)=>(x1== 值(控制台应用程序4.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));
inti=1;
表达式a=(x1,x2)=>x1==i;
二进制表达式x=(二进制表达式)a.Body;
var me=(MemberExpression)x.右;
var ce=(ConstantExpression)me.Expression;
var fieldInfo=(fieldInfo)me.Member;
Console.WriteLine(fieldInfo.GetValue(ce.Value));

事实上,即使
i
是一个“局部变量”,您也可以像在引用链接中那样做,因为在您的情况下
i
不再是局部变量。让我们打印我们的lambda:

Console.WriteLine((Expression<Func<int, int, bool>>) ((x1, x2) => x1 == i));
Console.WriteLine((表达式)((x1,x2)=>x1==i));
输出将是关于:

(x1,x2)=>(x1== 值(控制台应用程序4.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));
inti=1;
表达式a=(x1,x2)=>x1==i;
二进制表达式x=(二进制表达式)a.Body;
var me=(MemberExpression)x.右;
var ce=(ConstantExpression)me.Expression;
var fieldInfo=(fieldInfo)me.Member;
Console.WriteLine(fieldInfo.GetValue(ce.Value));

事实上,即使
i
是一个“局部变量”,您也可以像在引用链接中那样做,因为在您的情况下
i
不再是局部变量。让我们打印我们的lambda:

Console.WriteLine((Expression<Func<int, int, bool>>) ((x1, x2) => x1 == i));
Console.WriteLine((表达式)((x1,x2)=>x1==i));
输出将是关于:

(x1,x2)=>(x1== 值(控制台应用程序4.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));
inti=1;
表达式a=(x1,x2)=>x1==i;
二进制表达式x=(二进制表达式)a.Body;
var me=(MemberExpression)x.右;
var ce=(ConstantExpression)me.Expression;
var fieldInfo=(fieldInfo)me.Member;
Console.WriteLine(fieldInfo.GetValue(ce.Value));