internal static void Present(CliMetadataTableHeader header)
 {
     Shell.WriteHeader("CLI Metadata Table Header");
     Shell.WriteItem(nameof(header.Reserved), header.Reserved);
     Shell.WriteItem(nameof(header.Major), header.Major);
     Shell.WriteItem(nameof(header.Minor), header.Minor);
     Shell.WriteItem(nameof(header.HeapSizes), header.HeapSizes);
     Shell.WriteItem(nameof(header.Rid), header.Rid);
     Shell.WriteItem(nameof(header.MaskValid), header.MaskValid);
     Shell.WriteItem(nameof(header.MaskSorted), header.MaskSorted);
     Shell.WriteItem(nameof(header.RowCount), header.RowCount);
     Shell.WriteFooter();
 }
        internal static IList <IList <CliMetadataTokenBase> > Read(MetadataStreamReader reader, CliMetadataTableHeader tableHeader, uint indexSize)
        {
            var result = new List <IList <CliMetadataTokenBase> >();

            for (int i = 0, k = 0; i < tableHeader.MaskValidArray.Count; i++)
            {
                var token = (CliMetadataToken)i;

                if (tableHeader.MaskValidArray[i] == true && Enum.IsDefined(typeof(CliMetadataToken), i))
                {
                    var rowCount = tableHeader.RowCount[k++];

                    switch (token)
                    {
                    case CliMetadataToken.Module:
                    {
                        result.Add(CliMetadataTokenModuleReader.Read(reader, rowCount, indexSize));
                        break;
                    }

                    case CliMetadataToken.TypeRef:
                    {
                        result.Add(CliMetadataTokenTypeRefReader.Read(reader, rowCount, indexSize));
                        break;
                    }

                    case CliMetadataToken.TypeDef:
                    {
                        result.Add(CliMetadataTokenTypeDefReader.Read(reader, rowCount, indexSize));
                        break;
                    }

                    case CliMetadataToken.FieldPtr:
                    {
                        throw new NotSupportedException();
                    }

                    case CliMetadataToken.Field:
                    {
                        result.Add(CliMetadataTokenFieldReader.Read(reader, rowCount, indexSize));
                        break;
                    }

                    case CliMetadataToken.MethodPtr:
                    {
                        throw new NotSupportedException();
                    }

                    case CliMetadataToken.MethodDef:
                    {
                        result.Add(CliMetadataTokenMethodDefReader.Read(reader, rowCount, indexSize));
                        break;
                    }

                    case CliMetadataToken.ParamPtr:
                    {
                        throw new NotSupportedException();
                    }

                    case CliMetadataToken.Param:
                    {
                        result.Add(CliMetadataTokenParamReader.Read(reader, rowCount, indexSize));
                        break;
                    }

                    case CliMetadataToken.InterfaceImpl:
                    {
                        result.Add(CliMetadataTokenInterfaceImplReader.Read(reader, rowCount, indexSize));
                        break;
                    }

                    case CliMetadataToken.MemberRef:
                    {
                        result.Add(CliMetadataTokenMemberRefReader.Read(reader, rowCount, indexSize));
                        break;
                    }

                    case CliMetadataToken.Constant:
                    {
                        result.Add(CliMetadataTokenConstantReader.Read(reader, rowCount, indexSize));
                        break;
                    }

                    case CliMetadataToken.CustomAttribute:
                    {
                        result.Add(CliMetadataTokenCustomAttributeReader.Read(reader, rowCount, indexSize));
                        break;
                    }

                    case CliMetadataToken.FieldMarshal:
                    {
                        result.Add(CliMetadataTokenFieldMarshalReader.Read(reader, rowCount, indexSize));
                        break;
                    }

                    case CliMetadataToken.DeclSecurity:
                    {
                        result.Add(CliMetadataTokenDeclSecurityReader.Read(reader, rowCount, indexSize));
                        break;
                    }

                    case CliMetadataToken.ClassLayout:
                    {
                        result.Add(CliMetadataTokenClassLayoutReader.Read(reader, rowCount, indexSize));
                        break;
                    }

                    case CliMetadataToken.FieldLayout:
                    {
                        result.Add(CliMetadataTokenFieldLayoutReader.Read(reader, rowCount, indexSize));
                        break;
                    }

                    case CliMetadataToken.StandAloneSig:
                    {
                        result.Add(CliMetadataTokenStandAloneSigReader.Read(reader, rowCount, indexSize));
                        break;
                    }

                    case CliMetadataToken.EventMap:
                    {
                        result.Add(CliMetadataTokenEventMapReader.Read(reader, rowCount, indexSize));
                        break;
                    }

                    case CliMetadataToken.EventPtr:
                    {
                        throw new NotSupportedException();
                    }

                    case CliMetadataToken.Event:
                    {
                        result.Add(CliMetadataTokenEventReader.Read(reader, rowCount, indexSize));
                        break;
                    }

                    case CliMetadataToken.PropertyMap:
                    {
                        result.Add(CliMetadataTokenPropertyMapReader.Read(reader, rowCount, indexSize));
                        break;
                    }

                    case CliMetadataToken.PropertyPtr:
                    {
                        throw new NotSupportedException();
                    }

                    case CliMetadataToken.Property:
                    {
                        result.Add(CliMetadataTokenPropertyReader.Read(reader, rowCount, indexSize));
                        break;
                    }

                    case CliMetadataToken.MethodSemantics:
                    {
                        result.Add(CliMetadataTokenMethodSemanticsReader.Read(reader, rowCount, indexSize));
                        break;
                    }

                    case CliMetadataToken.MethodImpl:
                    {
                        result.Add(CliMetadataTokenMethodImplReader.Read(reader, rowCount, indexSize));
                        break;
                    }

                    case CliMetadataToken.ModuleRef:
                    {
                        result.Add(CliMetadataTokenModuleRefReader.Read(reader, rowCount, indexSize));
                        break;
                    }

                    case CliMetadataToken.TypeSpec:
                    {
                        result.Add(CliMetadataTokenTypeSpecReader.Read(reader, rowCount, indexSize));
                        break;
                    }

                    case CliMetadataToken.ImplMap:
                    {
                        result.Add(CliMetadataTokenImplMapReader.Read(reader, rowCount, indexSize));
                        break;
                    }

                    case CliMetadataToken.FieldRva:
                    {
                        result.Add(CliMetadataTokenFieldRvaReader.Read(reader, rowCount, indexSize));
                        break;
                    }

                    case CliMetadataToken.ENCLog:
                    {
                        throw new NotSupportedException();
                    }

                    case CliMetadataToken.ENCMap:
                    {
                        throw new NotSupportedException();
                    }

                    case CliMetadataToken.Assembly:
                    {
                        result.Add(CliMetadataTokenAssemblyReader.Read(reader, rowCount, indexSize));
                        break;
                    }

                    case CliMetadataToken.AssemblyProcessor:
                    {
                        result.Add(CliMetadataTokenAssemblyProcessorReader.Read(reader, rowCount));
                        break;
                    }

                    case CliMetadataToken.AssemblyOS:
                    {
                        result.Add(CliMetadataTokenAssemblyOSReader.Read(reader, rowCount));
                        break;
                    }

                    case CliMetadataToken.AssemblyRef:
                    {
                        result.Add(CliMetadataTokenAssemblyRefReader.Read(reader, rowCount, indexSize));
                        break;
                    }

                    case CliMetadataToken.AssemblyRefProcessor:
                    {
                        result.Add(CliMetadataTokenAssemblyRefProcessorReader.Read(reader, rowCount, indexSize));
                        break;
                    }

                    case CliMetadataToken.AssemblyRefOS:
                    {
                        result.Add(CliMetadataTokenAssemblyRefOSReader.Read(reader, rowCount, indexSize));
                        break;
                    }

                    case CliMetadataToken.File:
                    {
                        result.Add(CliMetadataTokenFileReader.Read(reader, rowCount, indexSize));
                        break;
                    }

                    case CliMetadataToken.ExportedType:
                    {
                        result.Add(CliMetadataTokenExportedTypeReader.Read(reader, rowCount, indexSize));
                        break;
                    }

                    case CliMetadataToken.ManifestResource:
                    {
                        result.Add(CliMetadataTokenManifestResourceReader.Read(reader, rowCount, indexSize));
                        break;
                    }

                    case CliMetadataToken.NestedClass:
                    {
                        result.Add(CliMetadataTokenNestedClassReader.Read(reader, rowCount, indexSize));
                        break;
                    }

                    case CliMetadataToken.GenericParam:
                    {
                        result.Add(CliMetadataTokenGenericParamReader.Read(reader, rowCount, indexSize));
                        break;
                    }

                    case CliMetadataToken.MethodSpec:
                    {
                        result.Add(CliMetadataTokenMethodSpecReader.Read(reader, rowCount, indexSize));
                        break;
                    }

                    case CliMetadataToken.GenericParamConstraint:
                    {
                        result.Add(CliMetadataTokenGenericParamConstraintReader.Read(reader, rowCount, indexSize));
                        break;
                    }

                    default:
                    {
                        throw new NotImplementedException();
                    }
                    }
                }
            }

            return(result);
        }