コード例 #1
0
        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));
        }
コード例 #2
0
        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);
                }
            }
        }