Простая арифметика дерева выражений C#

Я пытался понять, как выполнить простую математику с помощью класса Expression.

Я пытаюсь сделать это

(1 + 10 * 15)

Когда я пытаюсь сделать это с помощью Expression.Add и Expression.Constant, но получаю следующий результат:

((1 + 10) * 15)

Что неверно, так как сначала оценивается 1 + 10, а не 10 * 15.

Есть ли способ объединить Expression.Add/Multiply и т. д. без создания скобок? Я предполагаю, что есть, но я просто не могу найти, где и как!

Тестовый код у меня такой

        var v1 = Expression.Constant(1, typeof(int));
        var v2 = Expression.Constant(10, typeof(int));
        var v3 = Expression.Constant(15, typeof(int));

        var a1 = Expression.Add(v1, v2);
        var m2 = Expression.Multiply(a1, v3);

Спасибо за ваше время,

Ричард.


person Richard Adnams    schedule 22.12.2010    source источник


Ответы (4)


Сначала вам нужно выполнить умножение:

Expression.Add(v1, Expression.Multiply(v2, v3))
person Jan    schedule 22.12.2010

Вместо

    var a1 = Expression.Add(v1, v2);
    var m2 = Expression.Multiply(a1, v3);

попробуй с этим

    var a1 = Expression.Multiply(v2, v3);
    var m2 = Expression.Add(v1, a1);
person TRIVER    schedule 22.12.2010

Здесь вы найдете более крупный пример: http://teusje.wordpress.com/2011/08/07/c-expression-trees/ Он использует параметры, константы и бинарные выражения.

person juFo    schedule 05.09.2011

person    schedule
comment
Я пробовал это раньше, и да, это сработало, как и ожидалось, но поскольку это часть более широкой картины, порядок, из которого разбираются и собираются части, является плюсом. Итак, мне нужно будет упорядочить части в порядке BODMAS, чтобы выражение было построено правильно? - person Richard Adnams; 22.12.2010