Beispiel #1
0
        public object Resolve(
            string expression,
            IDictionary <string, object> model)
        {
            if (expression == null)
            {
                throw new ArgumentNullException(nameof(expression));
            }
            if (!Accept(expression))
            {
                throw new Exception($"Invalid equality expression: `{ expression }`.");
            }

            var match = Regex.Match(expression, regexPattern);

            var leftExp  = match.Groups["left"].Value;
            var rightExp = match.Groups["right"].Value;

            var engine = new RazorAlikeEngine();

            var left  = engine.ResolveExpression(leftExp, model);
            var right = engine.ResolveExpression(rightExp, model);

            return(left.Equals(right));
        }
Beispiel #2
0
        private bool EvaluateCondition(
            string condition,
            IDictionary <string, object> model)
        {
            if (condition == null)
            {
                throw new ArgumentNullException(nameof(condition));
            }

            // transformar este if num IStatement.
            if (condition.Trim().Equals("true", StringComparison.InvariantCultureIgnoreCase))
            {
                return(true);
            }

            if (condition.Trim().Equals("false", StringComparison.InvariantCultureIgnoreCase))
            {
                return(false);
            }

            var match = Regex.Match(condition, @"(?'left'[^=<>!]*)(?'operator'[=<>!]*)(?'right'[^=<>!]*)");

            if (match.Success)
            {
                var engine = new RazorAlikeEngine();

                var leftExp  = match.Groups["left"].Value.Trim();
                var rightExp = match.Groups["right"].Value.Trim();
                var op       = match.Groups["operator"].Value;

                var leftObj  = engine.ResolveExpression(leftExp, model);
                var rightObj = !string.IsNullOrEmpty(rightExp) ? engine.ResolveExpression(rightExp, model) : null;

                switch (op)
                {
                case null:
                case "":
                    if (!(leftObj is bool))
                    {
                        throw new InvalidCastException($"Expression `{ leftExp }` isn't a boolean variable.");
                    }
                    return((bool)leftObj);

                case "==":
                    return(leftObj.Equals(rightObj));

                case "!=":
                    return(!leftObj.Equals(rightObj));

                default:
                    throw new NotImplementedException($"Operator not implemented: `{ op }`.");
                }
            }

            throw new NotImplementedException();
        }