簡體   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