Как избежать необходимости возвращать целое число при построении выражения?
Я пытаюсь построить движок правил, используя некоторые элементы отражения и System. Linq.Пространство имен выражений. Я пытаюсь построить выражение Lamdba в виде
Выражение.Лямбда - &ЛТ;изм&ЛТ;Т, инт&ГТ;&ГТ;(expressionToCompile, параметр).Компилировать();
Что заставляет меня возвращать целое число из скомпилированного выражения - я попытался удалить int из определения функции, и это вызвало у меня больше проблем.
Что я уже пробовал:
На данный момент мой код содержит следующий метод:
private static void CompileRuleDefinition<T>(RuleDefinition<T> ruleDefinition) { var parameter = Expression.Parameter(typeof(T)); Expression expresion = BuildCompoundConditions(ruleDefinition, parameter); Expression expressionToCompile = null; Expression thenClause = BuildAssignExpression<T>(parameter, ruleDefinition.ThenAction); if (expresion != null) { if (ruleDefinition.ThenAction != null && ruleDefinition.ElseAction == null) { expressionToCompile = Expression.Block( Expression.IfThen( expresion, thenClause), Expression.Constant(42)); } if (ruleDefinition.ThenAction != null && ruleDefinition.ElseAction != null) { Expression elseClause = BuildAssignExpression<T>(parameter, ruleDefinition.ElseAction); expressionToCompile = Expression.Block( Expression.IfThenElse( expresion, thenClause, elseClause), Expression.Constant(42)); } if (expressionToCompile != null) { ruleDefinition.CompiledExpression = Expression.Lambda<Func<T, int>>(expressionToCompile, parameter).Compile(); } } }
Мне не нравится использование команды :
Expression.Constant(42));это ничего не делает в моем коде, а просто позволяет возвращать целое число. Типы, возвращаемые предложением "Then" и предложением "Else", могут варьироваться от" Void " (именно с этого началась моя проблема, поскольку действие может заключаться в вызове метода void в классе <t>) до int, bool и т. д.
То, что я ищу, - это решение, в котором мне не нужно иметь этот кусок избыточного кода.
(да, у кода действительно есть проблема, если ThenAction также NULL)
Philippe Mori
Вместо того чтобы пытаться Func<T, void>
, что произойдет, если вы используете Action<T>
вместо этого? Один Action
по существу, это как Func
без возвращаемого значения.