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