private MemberInfo GetMemberRef(int index, Type[] genericTypeArguments, Type[] genericMethodArguments) { if (memberRefs == null) { memberRefs = new MemberInfo[MemberRef.records.Length]; } if (memberRefs[index] == null) { int owner = MemberRef.records[index].Class; int sig = MemberRef.records[index].Signature; string name = GetString(MemberRef.records[index].Name); switch (owner >> 24) { case MethodDefTable.Index: return(GetMethodAt(null, (owner & 0xFFFFFF) - 1)); case ModuleRefTable.Index: memberRefs[index] = ResolveTypeMemberRef(ResolveModuleType(owner), name, ByteReader.FromBlob(blobHeap, sig)); break; case TypeDefTable.Index: case TypeRefTable.Index: memberRefs[index] = ResolveTypeMemberRef(ResolveType(owner), name, ByteReader.FromBlob(blobHeap, sig)); break; case TypeSpecTable.Index: { Type type = ResolveType(owner, genericTypeArguments, genericMethodArguments); if (type.IsArray) { MethodSignature methodSig = MethodSignature.ReadSig(this, ByteReader.FromBlob(blobHeap, sig), new GenericContext(genericTypeArguments, genericMethodArguments)); return(type.FindMethod(name, methodSig) ?? universe.GetMissingMethodOrThrow(type, name, methodSig)); } else if (type.IsConstructedGenericType) { MemberInfo member = ResolveTypeMemberRef(type.GetGenericTypeDefinition(), name, ByteReader.FromBlob(blobHeap, sig)); MethodBase mb = member as MethodBase; if (mb != null) { member = mb.BindTypeParameters(type); } FieldInfo fi = member as FieldInfo; if (fi != null) { member = fi.BindTypeParameters(type); } return(member); } else { return(ResolveTypeMemberRef(type, name, ByteReader.FromBlob(blobHeap, sig))); } } default: throw new BadImageFormatException(); } } return(memberRefs[index]); }