Exemplo n.º 1
0
        internal Type ReadType(string typeName = null, bool ignoreException = false)
        {
            Type          type    = null;
            StringBuilder sbValue = new StringBuilder(string.IsNullOrEmpty(typeName) ? spResult.Next().Text : typeName);

            do
            {
                // 读取参数
                if (spResult.IsGenericType())
                {
                    spResult.Skip();
                    List <Type> types = new List <Type>();
                    while (true)
                    {
                        types.Add(ReadType());
                        if (spResult.PeekNext().Is(OperatorWord.Comma))
                        {
                            spResult.Skip();
                        }
                        else
                        {
                            break;
                        }
                    }
                    spResult.Next().Is(OperatorWord.RightAngleBracket, true);

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

                type = GetType(sbValue.ToString());
                if (type == null)
                {
                    var token = spResult.Next();
                    if (!token.Is(OperatorWord.Dot))
                    {
                        if (ignoreException)
                        {
                            break;
                        }

                        throw new ArgumentException(string.Format("Unsupported {0}", token.Text));
                    }
                    sbValue.Append(".");
                    sbValue.Append(spResult.Next().Text);
                }
            } while (type == null);

            return(type);
        }
        /// <summary>
        /// 处理表达式前缀.
        /// </summary>
        private void ProcessLambdaPrefix()
        {
            // 检查是否有 Lambda 前置符(如: m => )
            if (spResult.Any(p => p.Is(OperatorWord.LambdaPrefix)))
            {
                Token token = spResult.Next();
                if (token.Is(OperatorWord.LeftBracket))
                {
                    // 有括号时,可以有多个参数
                    var bracketContent = spResult.SkipUntil(p => p.Is(OperatorWord.RightBracket));
                    bracketContent.RemoveAt(bracketContent.Count - 1);

                    // 检测下一个Token是否为LambdaPrefix
                    if (!spResult.Next().Is(OperatorWord.LambdaPrefix))
                    {
                        spResult.ReturnToIndex();
                        return;
                    }

                    // 解析参数
                    IEnumerable <Token> parameters = ResolveParameters(bracketContent);
                    int index = 0;
                    foreach (var item in parameters)
                    {
                        expParams.Add(Expression.Parameter(parameterTypes[index++], item.Text));
                    }
                }
                else if (token.Type == TokenType.Identifier && (char.IsLetter(token.Text[0]) || token.Text[0] == MarkChar.Underline) && !OperatorWord.Contains(token.Text))
                {
                    // 无括号时,最多只有一个参数
                    // 检测下一个Token是否为LambdaPrefix
                    if (!spResult.Next().Is(OperatorWord.LambdaPrefix))
                    {
                        spResult.ReturnToIndex();
                        return;
                    }

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

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