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)); }
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(); }