繁体   English   中英

评估表达式<Func<> &gt; 带变量

[英]Evaluation Expression<Func<>> with variables

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

我需要为此编写一个提供程序以及评估表达式内容的内容

如果我有以下查询:

Expression<Func<Person, bool>> expr;
expr = (p) => p.Name == "Smith";

这没问题,然后我可以使用表达式的 Body 属性给出以下结果

Body = {(p.Name == "Smith")}

如果我使用这样的变量:

Expression<Func<Person, bool>> expr;
string nameToFind = "Smith";
expr = (p) => p.Name == name;

我得到以下结果:

Body = {(p.Name == value(TestConsole.Program+<>c__DisplayClass0_0).nameToFind)}

在这种情况下,我想要的是解析表达式中的变量值,就像第一个没有变量的例子一样。

这可能吗? 对于示例或提示,我将非常感谢

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

public class Simplify : ExpressionVisitor{
    protected override Expression VisitMember(MemberExpression node){
        var expr = Visit(node.Expression);
        if (expr is ConstantExpression c){
            if (node.Member is PropertyInfo prop)
                return Expression.Constant(prop.GetValue(c.Value), prop.PropertyType);
            if (node.Member is FieldInfo field)
                return Expression.Constant(field.GetValue(c.Value), field.FieldType);
        }
        return node.Update(expr);
    }
}

expr = new Simplify().Visit(expr);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM