C# 求值表达式<;Func<&燃气轮机&燃气轮机;带变量

C# 求值表达式<;Func<&燃气轮机&燃气轮机;带变量,c#,reflection,expression,C#,Reflection,Expression,我们公司有一个框架,它请求查询作为表达式(Func(T,bool)),其中T是Buiniess对象的给定类型 我需要为此编写一个提供程序,以及如何计算表达式的内容 如果我有以下问题: Expression<Func<Person, bool>> expr; expr = (p) => p.Name == "Smith"; 如果我使用这样的变量: Expression<Func<Person, bool>> expr; string name

我们公司有一个框架,它请求查询作为表达式(Func(T,bool)),其中T是Buiniess对象的给定类型

我需要为此编写一个提供程序,以及如何计算表达式的内容

如果我有以下问题:

Expression<Func<Person, bool>> expr;
expr = (p) => p.Name == "Smith";
如果我使用这样的变量:

Expression<Func<Person, bool>> expr;
string nameToFind = "Smith";
expr = (p) => p.Name == name;
表达式表达式;
字符串名称find=“Smith”;
expr=(p)=>p.Name==Name;
我得到以下结果:

Body = {(p.Name == value(TestConsole.Program+<>c__DisplayClass0_0).nameToFind)}
Body={(p.Name==value(TestConsole.Program+c_udisplayclass0_0.nameToFind)}
我想要的是在这种情况下,在解析表达式中有变量值,就像在第一个没有变量的示例中一样

这可能吗?
我很乐意为您提供一个示例或提示

您要做的是替换任何左侧为
ConstantPression
类型的
MemberExpression
,使用反射来获取值。这就是
ExpressionVisitor
构建的目的

公共类简化:ExpressionVisitor{
受保护的重写表达式VisitMember(MemberExpression节点){
var expr=Visit(node.Expression);
if(表达式为恒压c){
if(node.Member是PropertyInfo prop)
返回表达式.Constant(prop.GetValue(c.Value),prop.PropertyType);
如果(node.Member是FieldInfo字段)
返回表达式.Constant(field.GetValue(c.Value)、field.FieldType);
}
返回node.Update(expr);
}
}
expr=new Simplify()。访问(expr);

您需要执行一些自底向上分析,以确定可以/应该计算什么,然后评估这些子表达式,并在表达式树中替换它们。在这种情况下,您基本上将display类/闭包标识为常量,对其求值并替换它。这就是一个例子。这是一个关于这个主题的很好的(虽然很老)系列。我不知道如何写一个答案,但我之前已经写过了,下面的链接是你的
表达式
类是什么?如何访问其
主体
?该类来自dotnet Framework System.Linq.Expressions.Expression---Body是Expression类的一个属性,结果是Expression.Body.ToString()Funktion的输出非常感谢,这正是我问题的解决方案,太好了!
Body = {(p.Name == value(TestConsole.Program+<>c__DisplayClass0_0).nameToFind)}