Как получить вычисленное значение из скомпилированного выражения LambdaExpression? - PullRequest
0 голосов
/ 02 мая 2011

В настоящее время я работаю над проектом на работе, и мы используем Telerik RadControls для Silverlight.В своем выпуске за первый квартал 2011 года они добавили новый элемент управления, который называется Rad Expression Editor.В редакторе выражений Rad вы можете передать объект и создать формулы (или выражения), а окно редактора предоставит вам предварительный просмотр результата выражения.Я говорил об этом с Telerik, и они намеренно не раскрыли результат этого, но упомянули, что я могу использовать LambdaExpression.Compile ().Я очень плохо знаком с Linq и использую лямбда-выражения в целом, но начал разбираться с этим.

В качестве примера, скажем, у меня есть объект с именем Finances, и в этом объекте есть 4 обнуляемых десятичных поля(значения): Дебет (10), ДебитYTD (100), Кредит (20) и КредитYTD (200).В формуле я хочу сделать что-то вроде: Дебет - Кредит + ДебитYTD - КредитYTD.

Редактор выражений Telerik Rad выдаст мне сгенерированное выражение: ExpressionEditor.Expression = {Param_0 => ((Param_0.Debit - Param_0.Credit + Param_0.DebitYTD - Param_0.CreditYTD}

Результатэтого выражения должно быть -110.Мне нужно иметь возможность получить значение, которое вычисляется в выражении, но не смог выяснить, как получить это число.Может кто-нибудь объяснить, как это можно сделать?Спасибо.

Ответы [ 2 ]

2 голосов
/ 02 мая 2011

Вы на самом деле мало рассказали нам об API, который он предоставляет, но он звучит , как вы могли бы использовать:

var compiled = ExpressionEditor.Expression.Compile();
var result = compiled(input);

, где input - подходящая переменнаявведите Finances.

РЕДАКТИРОВАТЬ: Хорошо, так как выражение не отображается красиво:

var typeSafe = (Expression<Func<Finance, decimal?>>) ExpressionEditor.Expression;
var compiled = typeSafe.Compile();
var result = compiled(input);
0 голосов
/ 07 июня 2011

У меня были очень похожие требования.Необходимо было скомпилировать выражение и выполнить оценку во время выполнения для разных экземпляров.Однако компиляция функций не так тривиальна, так как вы должны знать тип значения результата во время компиляции, и в большинстве случаев это будет невозможно: пользователь пишет «1 + 1», а вы получаете System.Int32 или пользователь пишет »(1 + 1) .ToString () "и вы получите System.String.Я уверен, что это тот момент, когда вы испытываете (или будете испытывать) трудности.

Чтобы решить проблему компиляции выражений, я бы порекомендовал перейти в DLR (Dynamic Language Runtime).Вам нужно будет ссылаться на сборку «Microsoft.CSharp» для вашего проекта Silverlight.Поскольку вам нужно просто получить доступ к методу «Compile» для выражения (которое уже есть), будет достаточно справедливо сделать это для «динамического» объекта.Вот короткий пример, чтобы продемонстрировать, что:

  dynamic dynamicExpression = expressionEditor.Expression;
  dynamic compiledExpression = dynamicExpression.Compile();
  object executionResult = compiledExpression(myInstance);

Переменная executeResult будет содержать результат оценки выражения.Теперь вы можете делать с результатом все, что вам нужно.

Надеюсь, это поможет

...