示例#1
0
        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);
        }