internal NamespaceChain(MetadataReader reader, NamespaceDefinitionHandle innerMostNamespaceHandle) { NamespaceDefinition currentNamespaceDefinition = innerMostNamespaceHandle.GetNamespaceDefinition(reader); ConstantStringValueHandle currentNameHandle = currentNamespaceDefinition.Name; Handle currentNamespaceHandle = innerMostNamespaceHandle.ToHandle(reader); LowLevelList<String> names = new LowLevelList<String>(); for (;;) { String name = currentNameHandle.GetStringOrNull(reader); names.Add(name); currentNamespaceHandle = currentNamespaceDefinition.ParentScopeOrNamespace; HandleType handleType = currentNamespaceHandle.HandleType; if (handleType == HandleType.ScopeDefinition) break; if (handleType == HandleType.NamespaceDefinition) { NamespaceDefinitionHandle nsHandle = currentNamespaceHandle.ToNamespaceDefinitionHandle(reader); currentNamespaceDefinition = nsHandle.GetNamespaceDefinition(reader); currentNameHandle = currentNamespaceDefinition.Name; continue; } throw new BadImageFormatException(SR.Bif_InvalidMetadata); } DefiningScope = currentNamespaceHandle.ToScopeDefinitionHandle(reader); int count = names.Count; if (count == 0) { // Every namespace chain has to start with the root namespace. throw new BadImageFormatException(); } else if (count == 1) { // The root namespace. For compat with the desktop, TypeInfo.NameSpaces returns null in this case. NameSpace = null; } else { // Namespace has at least one non-root component. StringBuilder sb = new StringBuilder(); int idx = count - 1; while (idx-- != 0) { String name = names[idx]; if (name == null) throw new BadImageFormatException(); // null namespace fragment found in middle. sb.Append(name); if (idx != 0) sb.Append('.'); } NameSpace = sb.ToString(); } }
internal static string GetNamespaceName(this MetadataReader metadataReader, NamespaceDefinitionHandle namespaceDefinitionHandle) { if (namespaceDefinitionHandle.IsNull(metadataReader)) { return null; } else { // TODO! Cache this result, or do something to make it more efficient. NamespaceDefinition namespaceDefinition = namespaceDefinitionHandle.GetNamespaceDefinition(metadataReader); string name = metadataReader.GetString(namespaceDefinition.Name) ?? ""; if (namespaceDefinition.ParentScopeOrNamespace.HandleType == HandleType.NamespaceDefinition) { string parentName = metadataReader.GetNamespaceName(namespaceDefinition.ParentScopeOrNamespace.ToNamespaceDefinitionHandle(metadataReader)); if (!string.IsNullOrEmpty(parentName)) { name = parentName + "." + name; } } return name; } }