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