public MetadataToken ExpandTypeDefRefOrSpecToken(uint pToken) { MetadataToken token = new MetadataToken(); token.Table = (byte)(pToken & 0x03); switch (token.Table) { case 0: token.Table = CLIMetadataTables.TypeDef; break; case 1: token.Table = CLIMetadataTables.TypeRef; break; case 2: token.Table = CLIMetadataTables.TypeSpec; break; default: return token; } uint index = pToken >> 2; if (index == 0) return token; --index; switch (token.Table) { case CLIMetadataTables.TypeDef: token.Data = TypeDefTable[index]; break; case CLIMetadataTables.TypeRef: token.Data = TypeRefTable[index]; break; case CLIMetadataTables.TypeSpec: token.Data = TypeSpecTable[index]; break; default: break; } return token; }
public MetadataToken ExpandMetadataToken(uint pToken) { MetadataToken token = new MetadataToken(); token.Table = (byte)(pToken >> 24); token.IsUserString = token.Table == CLIMetadataTables.UserStrings; uint index = pToken & 0x00FFFFFF; if (index == 0) return token; if (token.IsUserString) { token.Data = ReadUserStringHeap((int)index); return token; } --index; switch (token.Table) { case CLIMetadataTables.Module: token.Data = ModuleTable[index]; break; case CLIMetadataTables.TypeRef: token.Data = TypeDefTable[index]; break; case CLIMetadataTables.TypeDef: token.Data = TypeDefTable[index]; break; case CLIMetadataTables.Field: token.Data = FieldTable[index]; break; case CLIMetadataTables.MethodDef: token.Data = MethodDefTable[index]; break; case CLIMetadataTables.Param: token.Data = ParamTable[index]; break; case CLIMetadataTables.InterfaceImpl: token.Data = InterfaceImplTable[index]; break; case CLIMetadataTables.MemberRef: token.Data = MemberRefTable[index]; break; case CLIMetadataTables.Constant: token.Data = ConstantTable[index]; break; case CLIMetadataTables.CustomAttribute: token.Data = CustomAttributeTable[index]; break; case CLIMetadataTables.FieldMarshal: token.Data = FieldMarshalTable[index]; break; case CLIMetadataTables.DeclSecurity: token.Data = DeclSecurityTable[index]; break; case CLIMetadataTables.ClassLayout: token.Data = ClassLayoutTable[index]; break; case CLIMetadataTables.FieldLayout: token.Data = FieldLayoutTable[index]; break; case CLIMetadataTables.StandAloneSig: token.Data = StandAloneSigTable[index]; break; case CLIMetadataTables.EventMap: token.Data = EventMapTable[index]; break; case CLIMetadataTables.Event: token.Data = EventTable[index]; break; case CLIMetadataTables.PropertyMap: token.Data = PropertyMapTable[index]; break; case CLIMetadataTables.Property: token.Data = PropertyTable[index]; break; case CLIMetadataTables.MethodSemantics: token.Data = MethodSemanticsTable[index]; break; case CLIMetadataTables.MethodImpl: token.Data = MethodImplTable[index]; break; case CLIMetadataTables.ModuleRef: token.Data = ModuleRefTable[index]; break; case CLIMetadataTables.TypeSpec: token.Data = TypeSpecTable[index]; break; case CLIMetadataTables.ImplMap: token.Data = ImplMapTable[index]; break; case CLIMetadataTables.FieldRVA: token.Data = FieldRVATable[index]; break; case CLIMetadataTables.Assembly: token.Data = AssemblyTable[index]; break; case CLIMetadataTables.AssemblyProcessor: token.Data = AssemblyProcessorTable[index]; break; case CLIMetadataTables.AssemblyOS: token.Data = AssemblyOSTable[index]; break; case CLIMetadataTables.AssemblyRef: token.Data = AssemblyRefTable[index]; break; case CLIMetadataTables.AssemblyRefProcessor: token.Data = AssemblyRefProcessorTable[index]; break; case CLIMetadataTables.AssemblyRefOS: token.Data = AssemblyRefOSTable[index]; break; case CLIMetadataTables.File: token.Data = FileTable[index]; break; case CLIMetadataTables.ExportedType: token.Data = ExportedTypeTable[index]; break; case CLIMetadataTables.ManifestResource: token.Data = ManifestResourceTable[index]; break; case CLIMetadataTables.NestedClass: token.Data = NestedClassTable[index]; break; case CLIMetadataTables.GenericParam: token.Data = GenericParamTable[index]; break; case CLIMetadataTables.MethodSpec: token.Data = MethodSpecTable[index]; break; case CLIMetadataTables.GenericParamConstraint: token.Data = GenericParamConstraintTable[index]; break; default: break; } return token; }