public void ObjectListElementExpression() { var variableObjectExpr = new ObjectVariableExpression("a", typeof(A)); var listExpr = new ObjectPropertyExpression(variableObjectExpr, typeof(A).GetProperty("Bs")); var indexExpr = new NumericLiteralExpression(1); var expr = new ObjectListElementExpression(listExpr, indexExpr); B b; A a = new A { Bs = new[] { new B { Id = 0 }, b = new B { Id = 1 }, } }; object instance = expr.GetInstance(new Dictionary <string, object> { { "a", a } }); Assert.Same(b, instance); }
public void NumberListElementExpression() { var variableObjectExpr = new ObjectVariableExpression("a", typeof(A)); var listExpr = new ObjectPropertyExpression(variableObjectExpr, typeof(A).GetProperty("Ints")); var indexExpr = new NumericLiteralExpression(1); var expr = new NumericListElementExpression(listExpr, indexExpr); A a = new A { Ints = new List <int> { 1, 2 } }; double value = expr.Evaluate(new Dictionary <string, object> { { "a", a } }); Assert.Equal(2.0, value); }
// Based off of the next token, return the appropriate value // If the next token is punctuation or a function, return an AutoExpression private Expression GetNextValue(ref int toks) { Expression ret = new AutoExpression(); if (tokenizer.EOF()) { return(ret); } if (toks == 0) { return(ret); } var tok = tokenizer.Peek(); if (tok.Type == TokenType.Number) { ret = new NumericLiteralExpression(double.Parse(tok.Value)); } else if (tok.Type == TokenType.String) { ret = new StringLiteralExpression(tok.Value); } else if (tok.Type == TokenType.Variable) { ret = new VariableReferenceExpression(tok.Value); } else if (tok.Type == TokenType.InterpolatedString) { ret = HandleInterpolatedString(tok.Value); } if (ret is not AutoExpression) { toks--; tokenizer.Next(); } return(ret); }