如何获得lambda表达式的值[英] How to get the value of a lambda expression

问题描述

假设我们有以下内容:

 私有 静态 字符串 查询<T>(表达式<Func<T, bool>> pr){return pr.ToString();}...int ii = 1000;string str = Query((SalesInvoiceRow r) => r.Serial > ii && r.CustomerName.Contains("23"));

当您运行上述内容时,我们得到:
r =>((r.Serial > value(testing.program+<>c__DisplayClass0).ii) AndAlso r.CustomerName.Contains("23"))

我们如何才能得到 ii 的值,而不是像下面这样丑陋的语句?
r =>((r.Serial > 1000) AndAlso r.CustomerName.Contains("23"))

推荐答案

你好 Mehdi,

这是一些使用 ExpressionVisitor 调整的实验性代码:

静态 void Main(字符串[]参数){int a = 5;int b = 100;表达式<Func<int, bool>>expr = v => v > (a + b);WalkVisitor w = new WalkVisitor();w.访问(expr);}public class WalkVisitor : ExpressionVisitor{protected 覆盖 Expression VisitMember(MemberExpression node){var e = base.VisitMember(node);var c = node.Expression as ConstantExpression;if (c != null){类型 t = c.Value.GetType();var x = t.InvokeMember(node.Member.Name, BindingFlags.GetField,null, c.Value, null);Console.WriteLine("{0} = {1}", node.ToString(), x);}返回 e;}}


输出为:

value(ExprVisitor.Program+<>c__DisplayClass0).a = 5
value(ExprVisitor.Program+<>c__DisplayClass0).b = 100


您可能需要围绕此代码段实现打印访问者...

干杯

Andi

你应该能够编译表达式然后 ToString 它.

pr.Compile().ToString();


[编辑]
我刚刚意识到你想要 ii.我现在完全糊涂了.您不是将 ii 设置为 1000 吗?为什么你现在想要这个值?
也许您的意思是您希望解决查询.好吧,你应该按照我当时发布的内容进行操作,Compile :)

本文地址:https://www.itbaoku.cn/post/1394915.html