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