Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
            }
        }