private bool ResolveGenericsInterface(MethodDefinition method, MethodObject methodNode, TypeReference interfaceParent, TypeDefinition interfaceDefinition) { var genericTypes = TypeService.GetGenericTypeParameters(interfaceParent.FullName); if (interfaceDefinition.GenericParameters.Count != genericTypes.Count) { return(false); } var genericTypesDict = new Dictionary <string, string>(); for (int i = 0; i < interfaceDefinition.GenericParameters.Count; i++) { var genericPlaceholder = interfaceDefinition.GenericParameters[i].FullName; var typedGeneric = genericTypes[i]; genericTypesDict.Add(genericPlaceholder, typedGeneric); } foreach (var m in interfaceDefinition.Methods) { foreach (var k in genericTypesDict.Keys) { var typedMethodName = m.FullName.Replace(k, genericTypesDict[k]); var interfaceMethodNamePart = typedMethodName.Substring(typedMethodName.IndexOf("::") + 2); var concreteMethodNamePart = method.FullName.Substring(method.FullName.IndexOf("::") + 2); if (interfaceMethodNamePart.Equals(concreteMethodNamePart)) { // we replace a generic T type with a generic instance type and index that var sig = SignatureKeyService.ConvertFullNameToSignature(typedMethodName); MethodObjectsIndexedByFullName.Add(sig, methodNode); methodNode.InterfaceMethod = m; methodNode.ImplementsType = ImplementsType.Interface; return(true); } } } return(false); }