IList <MethodSig> PossibleMethodSigs(ITypeDefOrRef declaringType, MethodSig sig, MethodData data) { // Setup generic types IList <TypeSig> typeGenerics = new List <TypeSig>(), methodGenerics = new List <TypeSig>(); // Add all declaring spec generic types TypeSpec declaringSpec = declaringType as TypeSpec; if (declaringSpec != null) { var genericInstSig = declaringSpec.TryGetGenericInstSig(); foreach (var garg in genericInstSig.GenericArguments) { typeGenerics.Add(garg); } } // Add all method generic types if (data.HasGenericArguments) { foreach (var operand in data.GenericArguments) { var gtype = this.ResolveType_NoLock(operand.Position); methodGenerics.Add(gtype.ToTypeSig()); } } // Todo: Combinations factoring in the possibility that return type might match // a generic type TypeSig returnType = ResolveType(data.ReturnType); IList <TypeSig> returnTypes = GenericUtils.PossibleTypeSigs(returnType, typeGenerics, methodGenerics); TypeSig[] paramTypes = new TypeSig[data.Parameters.Length]; for (Int32 i = 0; i < paramTypes.Length; i++) { paramTypes[i] = ResolveType(data.Parameters[i]); } UInt32 genericTypeCount = (UInt32)data.GenericArguments.Length; IList <MethodSig> signatures = new List <MethodSig>(); var paramCombos = GenericUtils.CreateGenericParameterCombinations(paramTypes, typeGenerics, methodGenerics); foreach (var rType in returnTypes) { foreach (var combo in paramCombos) { var paramCombo = combo.ToArray(); MethodSig methodSig; if (genericTypeCount == 0) { if (data.IsStatic) { methodSig = MethodSig.CreateStatic(rType, paramCombo); } else { methodSig = MethodSig.CreateInstance(rType, paramCombo); } } else { if (data.IsStatic) { methodSig = MethodSig.CreateStaticGeneric(genericTypeCount, rType, paramCombo); } else { methodSig = MethodSig.CreateInstanceGeneric(genericTypeCount, rType, paramCombo); } } signatures.Add(methodSig); } } return(signatures); }