private bool FindInterfaceMethod(MethodDefinition method, MethodObject methodNode) { // multi level inheritance is flattened here foreach (var interfaceParent in method.DeclaringType.Interfaces) { var matchingMethod = InterfaceMethodsIndexedByTypeName.Get(interfaceParent.InterfaceType.FullName) .FirstOrDefault(x => SignatureKeyService.GetMethodSignature(x).Equals(SignatureKeyService.GetMethodSignature(method))); if (matchingMethod != null) { methodNode.InterfaceMethod = matchingMethod; methodNode.ImplementsType = ImplementsType.Interface; return(true); } else // might be an interface with generics. We have indexed the generic form but now search using a generic instance (instead of T, a real type) { TypeDefinition interfaceDefinition = null; var resolved = ResolveService.TryResolve(interfaceParent.InterfaceType, out interfaceDefinition); if (resolved && interfaceDefinition.GenericParameters.Any()) { return(ResolveGenericsInterface(method, methodNode, interfaceParent.InterfaceType, interfaceDefinition)); } } } return(false); }
private void IndexInterfaceMethods(ModuleDefinition module) { var interfaceMethods = DecompilerService.GetInterfaceMethods(module); foreach (var method in interfaceMethods) { // index by a simplified generic signature if it is a generic interface method var genericSignature = SignatureKeyService.GetGenericMethodSignature(method); if (!string.IsNullOrEmpty(genericSignature)) { if (!InterfaceMethodsIndexedByGenericSignature.ContainsKey(genericSignature)) { InterfaceMethodsIndexedByGenericSignature.Add(genericSignature, method); } } // index by the standard method signature var methodSignature = SignatureKeyService.GetFullMethodSignature(method); if (!InterfaceMethodsIndexedByName.ContainsKey(methodSignature)) { InterfaceMethodsIndexedByName.Add(methodSignature, method); } InterfaceMethodsIndexedByTypeName.Add(method.DeclaringType.FullName, method); InterfaceMethodsList.Add(method); } }