internal static MethodBase FindMostDerivedMatch(MethodBase[] match) { int num = 0; int num2 = -1; int num3 = match.Length; for (int i = 0; i < num3; i++) { MethodBase methodBase = match[i]; int derivedLevel = Binder.GetDerivedLevel(methodBase.DeclaringType); if (derivedLevel == num) { throw new AmbiguousMatchException(); } if (num2 >= 0) { ParameterInfo[] parameters = methodBase.GetParameters(); ParameterInfo[] parameters2 = match[num2].GetParameters(); bool flag = true; if (parameters.Length != parameters2.Length) { flag = false; } else { for (int j = 0; j < parameters.Length; j++) { if (parameters[j].ParameterType != parameters2[j].ParameterType) { flag = false; break; } } } if (!flag) { throw new AmbiguousMatchException(); } } if (derivedLevel > num) { num = derivedLevel; num2 = i; } } return(match[num2]); }
public override PropertyInfo SelectProperty(BindingFlags bindingAttr, PropertyInfo[] match, Type returnType, Type[] indexes, ParameterModifier[] modifiers) { if (match == null || match.Length == 0) { throw new ArgumentException("No properties provided", "match"); } bool flag = returnType != null; int num = (indexes == null) ? -1 : indexes.Length; PropertyInfo propertyInfo = null; int num2 = 2147483646; int num3 = int.MaxValue; int num4 = 0; for (int i = match.Length - 1; i >= 0; i--) { PropertyInfo propertyInfo2 = match[i]; ParameterInfo[] indexParameters = propertyInfo2.GetIndexParameters(); if (num < 0 || num == indexParameters.Length) { if (!flag || propertyInfo2.PropertyType == returnType) { int num5 = 2147483646; if (num > 0) { num5 = Binder.Default.check_arguments_with_score(indexes, indexParameters); if (num5 == -1) { goto IL_10E; } } int derivedLevel = Binder.GetDerivedLevel(propertyInfo2.DeclaringType); if (propertyInfo != null) { if (num2 < num5) { goto IL_10E; } if (num2 == num5) { if (num4 == derivedLevel) { num3 = num5; goto IL_10E; } if (num4 > derivedLevel) { goto IL_10E; } } } propertyInfo = propertyInfo2; num2 = num5; num4 = derivedLevel; } } IL_10E :; } if (num3 <= num2) { throw new AmbiguousMatchException(); } return(propertyInfo); }