private float ComputeScoreForParamArray(ParameterInfo[] parameters, Type[] argTypes) { var paramArrayParameter = parameters[parameters.Length - 1]; var fixedParameterCount = paramArrayParameter.Position; var fixedParameters = new ParameterInfo[fixedParameterCount]; Array.Copy(parameters, fixedParameters, fixedParameterCount); var fixedSum = ComputeSum(fixedParameters, this.myFixedArgTypes); var paramArrayElementType = paramArrayParameter.ParameterType.GetElementType(); var paramArraySum = 0; foreach (var argType in this.myParamArrayArgTypes) { paramArraySum += ImplicitConverter.GetImplicitConvertScore(argType, paramArrayElementType); } float score = 0; if (argTypes.Length > 0) { score = (fixedSum + paramArraySum) / argTypes.Length; } else { score = 0; } // The param array score gets a slight penalty so that it scores worse than direct matches return(score + 1); }
private static int ComputeSum(ParameterInfo[] parameters, Type[] argTypes) { Debug.Assert(parameters.Length == argTypes.Length); var sum = 0; for (var i = 0; i <= parameters.Length - 1; i++) { sum += ImplicitConverter.GetImplicitConvertScore(argTypes[i], parameters[i].ParameterType); } return(sum); }