private static void EvaluateCandidate(List<CandidateMember> candidates, MemberInfo candidateMember, ParameterInfo[] parameters, List<Argument> arguments, out ValidationError error, BuildArgCountMismatchError buildArgCountMismatchError) { error = null; int count = arguments.Count; string name = candidateMember.Name; if ((parameters == null) || (parameters.Length == 0)) { if (count == 0) { candidates.Add(new CandidateMember(candidateMember)); } else { error = buildArgCountMismatchError(name, count); } } else { List<CandidateParameter> signature = new List<CandidateParameter>(); int length = parameters.Length; int num3 = length; ParameterInfo paramInfo = parameters[length - 1]; if (paramInfo.ParameterType.IsArray) { object[] customAttributes = paramInfo.GetCustomAttributes(typeof(ParamArrayAttribute), false); if ((customAttributes != null) && (customAttributes.Length > 0)) { num3--; } } if (count < num3) { error = buildArgCountMismatchError(name, count); } else if ((num3 == length) && (count != length)) { error = buildArgCountMismatchError(name, count); } else { int index = 0; while (index < num3) { CandidateParameter item = new CandidateParameter(parameters[index]); if (!item.Match(arguments[index], name, index + 1, out error)) { break; } signature.Add(item); index++; } if (index == num3) { if (num3 < length) { CandidateMember member = null; if (count == num3) { member = new CandidateMember(candidateMember, parameters, signature, CandidateMember.Form.Expanded); } else if (count == length) { CandidateParameter parameter2 = new CandidateParameter(paramInfo); if (parameter2.Match(arguments[index], name, index + 1, out error)) { signature.Add(parameter2); member = new CandidateMember(candidateMember, parameters, signature, CandidateMember.Form.Normal); } } if (member == null) { CandidateParameter parameter3 = new CandidateParameter(paramInfo.ParameterType.GetElementType()); while (index < count) { if (!parameter3.Match(arguments[index], name, index + 1, out error)) { return; } signature.Add(parameter3); index++; } member = new CandidateMember(candidateMember, parameters, signature, CandidateMember.Form.Expanded); } candidates.Add(member); } else { candidates.Add(new CandidateMember(candidateMember, parameters, signature, CandidateMember.Form.Normal)); } } } } }
private static void EvaluateCandidate(List<CandidateMember> candidates, MemberInfo candidateMember, ParameterInfo[] parameters, List<Argument> arguments, out ValidationError error, BuildArgCountMismatchError buildArgCountMismatchError) { error = null; int numArguments = arguments.Count; string candidateName = candidateMember.Name; if (parameters == null || parameters.Length == 0) { // If there were no arguments supplied, and this method has no parameters, // then it's a candidate. (It should be the only one.) if (numArguments == 0) { candidates.Add(new CandidateMember(candidateMember)); } else { error = buildArgCountMismatchError(candidateName, numArguments); } } else { List<CandidateParameter> signature = new List<CandidateParameter>(); int parameterCount = parameters.Length; int fixedParameterCount = parameterCount; // Check to see if the last parameter is (1) an array and (2) has a ParamArrayAttribute // (i.e., it is a "params" array). ParameterInfo lastParam = parameters[parameterCount - 1]; if (lastParam.ParameterType.IsArray) { object[] attrs = lastParam.GetCustomAttributes(typeof(ParamArrayAttribute), false); if (attrs != null && attrs.Length > 0) fixedParameterCount -= 1; } if (numArguments < fixedParameterCount) { // Not enough arguments were passed for this to be a candidate. error = buildArgCountMismatchError(candidateName, numArguments); return; } else if (fixedParameterCount == parameterCount && numArguments != parameterCount) { // Too many arguments were passed for this to be a candidate. error = buildArgCountMismatchError(candidateName, numArguments); return; } // For the fixed part of the method signature, make sure each argument can // be implicitly converted to the corresponding parameter. int p = 0; for (; p < fixedParameterCount; ++p) { CandidateParameter candidateParam = new CandidateParameter(parameters[p]); if (!candidateParam.Match(arguments[p], candidateName, p + 1, out error)) break; // argument #p didn't match // If we get here, then so far so good. signature.Add(candidateParam); } if (p != fixedParameterCount) { // We didn't match all of the fixed part. This method is not a candidate. return; } if (fixedParameterCount < parameterCount) { // The last parameter was a "params" array. As long as zero or more arguments // are assignable, it's a valid candidate in the expanded form. CandidateMember candidateMethod = null; if (numArguments == fixedParameterCount) { // Zero arguments were passed as the params array. The method is a candidate // in its expanded form. candidateMethod = new CandidateMember(candidateMember, parameters, signature, CandidateMember.Form.Expanded); } else if (numArguments == parameterCount) { // Special case: one argument was passed as the params array. CandidateParameter candidateParam = new CandidateParameter(lastParam); if (candidateParam.Match(arguments[p], candidateName, p + 1, out error)) { // It was the same array type as the params array, so the candidate // matched in its normal form. signature.Add(candidateParam); candidateMethod = new CandidateMember(candidateMember, parameters, signature, CandidateMember.Form.Normal); } } if (candidateMethod == null) { // One or more arguments were passed as the params array. As long // as they match the element type, this method is a candidate. CandidateParameter candidateParam = new CandidateParameter(lastParam.ParameterType.GetElementType()); for (; p < numArguments; ++p) { if (!candidateParam.Match(arguments[p], candidateName, p + 1, out error)) { // Not all of the trailing arguments matched the params array's element type; // this cannot be a candidate. return; } // If we get here, then so far so good. signature.Add(candidateParam); } // All the trailing arguments matched, so this is a candidate in the expanded form. candidateMethod = new CandidateMember(candidateMember, parameters, signature, CandidateMember.Form.Expanded); } candidates.Add(candidateMethod); } else { // The last parameter wasn't "params". This candidate matched in its normal form. candidates.Add(new CandidateMember(candidateMember, parameters, signature, CandidateMember.Form.Normal)); } } }