Пример #1
0
        internal Type ReadType(string typeName = null, bool ignoreException = false)
        {
            Type          type    = null;
            StringBuilder sbValue =
                new StringBuilder(string.IsNullOrEmpty(typeName) ? spResult.Next() : typeName);

            do
            {
                // read generic parameters
                if (spResult.PeekNext() == "<")
                {
                    spResult.Skip();
                    List <Type> listGenericType = new List <Type>();
                    while (true)
                    {
                        listGenericType.Add(ReadType());
                        if (spResult.PeekNext() == ",")
                        {
                            spResult.Skip();
                        }
                        else
                        {
                            break;
                        }
                    }
                    NextIsEqual(">");

                    sbValue.AppendFormat("`{0}[{1}]", listGenericType.Count,
                                         string.Join(",", listGenericType
                                                     .Select(p => "[" + p.AssemblyQualifiedName + "]").ToArray()));
                }

                type = GetType(sbValue.ToString());
                if (type == null)
                {
                    bool result = NextIsEqual(".", false);
                    if (!result)
                    {
                        if (ignoreException)
                        {
                            break;
                        }
                        throw new ParseUnfindTypeException(sbValue.ToString(), spResult.Index);
                    }
                    sbValue.Append(".");
                    sbValue.Append(spResult.Next());
                }
            } while (type == null);

            return(type);
        }
Пример #2
0
        /// <summary>
        /// 处理表达式前缀.
        /// </summary>
        private void ProcessLambdaPrefix()
        {
            // 检查是否有 Lambda 前置符(如: m => )
            if (spResult.Any(p => p.ID == TokenId.LambdaPrefix))
            {
                Token token = spResult.Next();
                if (token.ID == TokenId.OpenParen)
                {
                    var bracketContent = spResult.SkipUntil(p => p.ID == TokenId.CloseParen);
                    bracketContent.RemoveAt(bracketContent.Count - 1);

                    if (bracketContent.Any(p => p.ID == TokenId.OpenParen))
                    {
                        throw new ParserSyntaxErrorException();
                    }

                    // 如果读取到 => 符号表示有
                    if (!spResult.NextIs(TokenId.LambdaPrefix))
                    {
                        spResult.ReturnToIndex(-1);
                        return;
                    }

                    // 解析参数
                    ResolveParameters(bracketContent).Foreach((p, i) =>
                    {
                        if (p.ExistType)
                        {
                            expParams.Add(Expression.Parameter(typeParser.GetType(p.Type), p.Variable));
                        }
                        else
                        {
                            expParams.Add(Expression.Parameter(parameterTypes[i], p.Variable));
                        }
                    });
                }
                else if (token.ID == TokenId.Identifier &&
                         (char.IsLetter(token.Text[0]) || token.Text[0] == '_') &&
                         !(token.Text == "true" ||
                           token.Text == "false" ||
                           token.Text == "null" ||
                           token.Text == "sizeof" ||
                           token.Text == "new" ||
                           token.Text == "typeof"))
                {
                    if (!spResult.NextIs(TokenId.LambdaPrefix))
                    {
                        spResult.ReturnToIndex(-1);
                        return;
                    }

                    expParams.Add(Expression.Parameter(parameterTypes[0], token.Text));
                }

                // 参数表达式个数和传入委托参数个数不匹配判断
                if (expParams.Count != parameterTypes.Length)
                {
                    throw new ApplicationException("The count of parameters is not equal.");
                }
            }
        }