public JMappingFunction TryGetFunction(Type[] parameterTypes) { JMappingFunction ret = null; var functions = new List <JMappingFunction>(); foreach (var item in _functions) { if (item.ParameterTypes != parameterTypes) { continue; } if (TypeUtils.CompareTypes(item.ParameterTypes, parameterTypes)) { functions.Add(item); } } if (functions.Count != 0) { var max = 0; ret = functions[0]; foreach (var function in functions) { var t = 0; for (int i = 0; i < function.ParameterTypes.Length; i++) { if (parameterTypes[i] == null) { continue; } else if (parameterTypes[i] == function.ParameterTypes[i]) { t += 2; } else { t += 1; } } if (t > max) { ret = function; max = t; } } } return(ret); }