Пример #1
0
        public List <RpcMethodInfo> FilterAndBuildMethodInfoByRequest(List <MethodInfo> methods, RpcRequest request)
        {
            //Case insenstive check for hybrid approach. Will check for case sensitive if there is ambiguity
            List <MethodInfo> methodsWithSameName = methods
                                                    .Where(m => string.Equals(m.Name, request.Method, StringComparison.OrdinalIgnoreCase))
                                                    .ToList();

            if (!methodsWithSameName.Any())
            {
                string methodName = DefaultRequestMatcher.FixCase(request.Method);

                if (methodName != null)
                {
                    methodsWithSameName = methods
                                          .Where(m => string.Equals(m.Name, methodName, StringComparison.OrdinalIgnoreCase))
                                          .ToList();
                }
            }
            var potentialMatches = new List <RpcMethodInfo>();

            foreach (MethodInfo method in methodsWithSameName)
            {
                (bool isMatch, RpcMethodInfo methodInfo) = this.HasParameterSignature(method, request);
                if (isMatch)
                {
                    potentialMatches.Add(methodInfo);
                }
            }

            if (potentialMatches.Count > 1)
            {
                //Try to remove ambiguity with 'perfect matching' (usually optional params and types)
                List <RpcMethodInfo> exactMatches = potentialMatches
                                                    .Where(p => p.HasExactParameterMatch())
                                                    .ToList();
                if (exactMatches.Any())
                {
                    potentialMatches = exactMatches;
                }
                if (potentialMatches.Count > 1)
                {
                    //Try to remove ambiguity with case sensitive check
                    potentialMatches = potentialMatches
                                       .Where(m => string.Equals(m.Method.Name, request.Method, StringComparison.Ordinal))
                                       .ToList();
                }
            }

            return(potentialMatches);
        }
Пример #2
0
 /// <summary>
 /// Tries to parse the parameter map into an ordered parameter list
 /// </summary>
 /// <param name="parametersMap">Map of parameter name to parameter value</param>
 /// <param name="parameterList">Result of converting the map to an ordered list, null if result is False</param>
 /// <returns>True if the parameters can convert to an ordered list based on the method signature, otherwise Fasle</returns>
 private bool TryParseParameterList(MethodInfo method, Dictionary <string, object> parametersMap, out object[] parameterList)
 {
     parametersMap = parametersMap
                     .ToDictionary(x => DefaultRequestMatcher.FixCase(x.Key) ?? x.Key, v => v.Value, StringComparer.OrdinalIgnoreCase);
     ParameterInfo[] parameterInfoList = method.GetParameters();
     parameterList = new object[parameterInfoList.Count()];
     foreach (ParameterInfo parameterInfo in parameterInfoList)
     {
         if (!parametersMap.ContainsKey(parameterInfo.Name))
         {
             if (!parameterInfo.IsOptional)
             {
                 parameterList = null;
                 return(false);
             }
         }
         else
         {
             parameterList[parameterInfo.Position] = parametersMap[parameterInfo.Name];
         }
     }
     return(true);
 }