Выражение оценки > с переменными - PullRequest
0 голосов
/ 27 марта 2020

У нашей компании есть Framework, который запрашивает запросы как выражение (Fun c (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)}

В этом случае я хочу иметь переменные Значение в разобранном выражении, как в первом примере без переменных.

Возможно ли это? Буду очень признателен за пример или подсказку

1 Ответ

1 голос
/ 27 марта 2020

Что вы хотите сделать, это заменить любой MemberExpression, который имеет левую часть типа ConstantExpression, используя отражение, чтобы получить значение. Для этого и создана 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);
...