private float ComputeScoreForParamArray(ParameterInfo[] parameters, Type[] argTypes) { ParameterInfo paramArrayParameter = parameters[parameters.Length - 1]; int fixedParameterCount = paramArrayParameter.Position; ParameterInfo[] fixedParameters = new ParameterInfo[fixedParameterCount]; System.Array.Copy(parameters, fixedParameters, fixedParameterCount); int fixedSum = ComputeSum(fixedParameters, MyFixedArgTypes); Type paramArrayElementType = paramArrayParameter.ParameterType.GetElementType(); int paramArraySum = 0; foreach (Type argType in 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); int sum = 0; for (int i = 0; i <= parameters.Length - 1; i++) { sum += ImplicitConverter.GetImplicitConvertScore(argTypes[i], parameters[i].ParameterType); } return(sum); }