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);
        }
コード例 #3
0
ファイル: Parser.cs プロジェクト: Gymhgy/TerseLang
        // 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);
        }