405 {
407 for (
int i = 0;
i < types.Length;
i++)
408 {
409 array[
i] = types[
i].UnderlyingSystemType;
411 {
413 }
414 }
417 {
419 }
421 int num = 0;
422 for (
int i = 0;
i < array2.Length;
i++)
423 {
425 if (parametersNoCopy.Length != types.Length)
426 {
427 continue;
428 }
429 int j;
430 for (j = 0; j < types.Length; j++)
431 {
433 if (types[j].MatchesParameterTypeExactly(parametersNoCopy[j]) || parameterType == typeof(object))
434 {
435 continue;
436 }
439 {
441 {
442 break;
443 }
444 type = signatureType.TryResolveAgainstGenericMethod(genericMethod);
446 {
447 break;
448 }
449 }
450 if (parameterType.IsPrimitive)
451 {
452 if (!
type.UnderlyingSystemType.IsRuntimeImplemented() || !
CanChangePrimitive(
type.UnderlyingSystemType, parameterType.UnderlyingSystemType))
453 {
454 break;
455 }
456 }
457 else if (!parameterType.IsAssignableFrom(
type))
458 {
459 break;
460 }
461 }
462 if (j == types.Length)
463 {
464 array2[num++] = array2[
i];
465 }
466 }
467 switch (num)
468 {
469 case 0:
470 return null;
471 case 1:
472 return array2[0];
473 default:
474 {
475 int num2 = 0;
476 bool flag = false;
477 int[] array3 = new int[types.Length];
478 for (
int i = 0;
i < types.Length;
i++)
479 {
481 }
482 for (
int i = 1;
i < num;
i++)
483 {
485 {
486 case 0:
487 flag = true;
488 break;
489 case 2:
490 flag = false;
492 break;
493 }
494 }
495 if (flag)
496 {
498 }
499 return array2[num2];
500 }
501 }
502 }
static int FindMostSpecificMethod(MethodBase m1, int[] paramOrder1, Type paramArrayType1, MethodBase m2, int[] paramOrder2, Type paramArrayType2, Type[] types, object[] args)
static bool CanChangePrimitive(Type source, Type target)
virtual ParameterInfo[] GetParametersNoCopy()
virtual Type ParameterType