private static MethodDesc FindImplFromDeclFromMethodImpls(MetadataType type, MethodDesc decl) { MethodImplRecord[] foundMethodImpls = type.FindMethodsImplWithMatchingDeclName(decl.Name); if (foundMethodImpls == null) { return(null); } bool interfaceDecl = decl.OwningType.IsInterface; foreach (MethodImplRecord record in foundMethodImpls) { MethodDesc recordDecl = record.Decl; if (interfaceDecl != recordDecl.OwningType.IsInterface) { continue; } if (!interfaceDecl) { recordDecl = FindSlotDefiningMethodForVirtualMethod(recordDecl); } if (recordDecl == decl) { return(FindSlotDefiningMethodForVirtualMethod(record.Body)); } } return(null); }
/// <summary> /// Try to resolve a given virtual static interface method on a given constrained type and return the resolved method or null when not found. /// </summary> /// <param name="constrainedType">Type to attempt method resolution on</param> /// <param name="interfaceMethod">Method to resolve</param> /// <returns>MethodDesc of the resolved method or null when not found (runtime lookup must be used)</returns> private static MethodDesc TryResolveVirtualStaticMethodOnThisType(MetadataType constrainedType, MethodDesc interfaceMethod) { Debug.Assert(interfaceMethod.Signature.IsStatic); MethodImplRecord[] possibleImpls = constrainedType.FindMethodsImplWithMatchingDeclName(interfaceMethod.Name); if (possibleImpls == null) { return(null); } MethodDesc interfaceMethodDefinition = interfaceMethod.GetMethodDefinition(); foreach (MethodImplRecord methodImpl in possibleImpls) { if (methodImpl.Decl == interfaceMethodDefinition) { MethodDesc resolvedMethodImpl = methodImpl.Body; if (interfaceMethod != interfaceMethodDefinition) { resolvedMethodImpl = resolvedMethodImpl.MakeInstantiatedMethod(interfaceMethod.Instantiation); } return(resolvedMethodImpl); } } return(null); }