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); }
/// <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."); } } }