private IType OnGetType() { if (this.metadataEntry == null) { throw new InvalidOperationException(); } var metadataEntryCtor = metadataEntry.Ctor; if (metadataEntryCtor == null) { throw new InvalidOperationException(); } ICliMetadataTypeDefinitionTableRow typeDef = null; switch (metadataEntryCtor.CustomAttributeTypeEncoding) { case CliMetadataCustomAttributeTypeTag.MethodDefinition: ICliMetadataMethodDefinitionTableRow methodDefinition = (ICliMetadataMethodDefinitionTableRow)metadataEntryCtor; var tdTable = metadataEntry.MetadataRoot.TableStream.TypeDefinitionTable; uint typeIndex = tdTable.GetTypeFromMethodIndex(methodDefinition.Index); typeDef = tdTable[(int)typeIndex]; break; case CliMetadataCustomAttributeTypeTag.MemberReference: ICliMetadataMemberReferenceTableRow reference = (ICliMetadataMemberReferenceTableRow)metadataEntryCtor; switch (reference.ClassSource) { case CliMetadataMemberRefParentTag.TypeDefinition: typeDef = (ICliMetadataTypeDefinitionTableRow)reference.Class; break; case CliMetadataMemberRefParentTag.TypeReference: typeDef = identityManager.ResolveScope((ICliMetadataTypeRefTableRow)reference.Class); break; case CliMetadataMemberRefParentTag.TypeSpecification: case CliMetadataMemberRefParentTag.ModuleReference: case CliMetadataMemberRefParentTag.MethodDefinition: default: throw new BadImageFormatException(); } break; } if (typeDef == null) { throw new BadImageFormatException(); } return(identityManager.ObtainTypeReference(typeDef)); }
internal static IEnumerable <IInterfaceType> GetImplementations(ICliMetadataTypeDefinitionTableRow parentDef, ICliMetadataMethodDefinitionTableRow methodMetadata, CliManager identityManager, IType activeType, IMethodSignatureMember activeMethod, IAssembly activeAssembly) { var targets = (from t in parentDef.ImplementationMap where t.MethodBody == methodMetadata select t.MethodDeclaration); foreach (var target in targets) { IType currentType = null; switch (target.MethodDefOrRefEncoding) { case CliMetadataMethodDefOrRefTag.MethodDefinition: ICliMetadataMethodDefinitionTableRow methodDef = (ICliMetadataMethodDefinitionTableRow)target; currentType = identityManager.ObtainTypeReference(methodMetadata.MetadataRoot.TableStream.TypeDefinitionTable[(int)methodMetadata.MetadataRoot.TableStream.TypeDefinitionTable.GetTypeFromMethodIndex(methodDef.Index)], activeType, activeMethod, activeAssembly); break; case CliMetadataMethodDefOrRefTag.MemberRef: ICliMetadataMemberReferenceTableRow memberRef = (ICliMetadataMemberReferenceTableRow)target; switch (memberRef.ClassSource) { case CliMetadataMemberRefParentTag.TypeDefinition: currentType = identityManager.ObtainTypeReference((ICliMetadataTypeDefinitionTableRow)memberRef.Class, activeType, activeMethod, activeAssembly); break; case CliMetadataMemberRefParentTag.TypeReference: currentType = identityManager.ObtainTypeReference((ICliMetadataTypeRefTableRow)memberRef.Class, activeType, activeMethod, activeAssembly); break; case CliMetadataMemberRefParentTag.TypeSpecification: currentType = identityManager.ObtainTypeReference((ICliMetadataTypeSpecificationTableRow)memberRef.Class, activeType, activeMethod, activeAssembly); break; } break; } if (currentType != null && currentType is IInterfaceType) { yield return((IInterfaceType)currentType); } } }