private static string GetFullName(MetadataReader reader, TypeDefinition type) { var typeName = reader.GetString(type.Name); if (TypeAttributes.NestedPublic == (type.Attributes & TypeAttributes.NestedPublic)) { // Need to take into account the containing type. var declaringType = reader.GetTypeDefinition(type.GetDeclaringType()); var declaringTypeFullName = GetFullName(reader, declaringType); return $"{declaringTypeFullName}+{typeName}"; } var namespaceName = reader.GetString(type.Namespace); if (string.IsNullOrEmpty(namespaceName)) { return typeName; } return $"{namespaceName}.{typeName}"; }
private bool IsPubliclyVisible(MetadataReader metadataReader, TypeDefinition typeDefinition) { switch (typeDefinition.Attributes & TypeAttributes.VisibilityMask) { case TypeAttributes.Public: return true; case TypeAttributes.NestedPublic: case TypeAttributes.NestedFamORAssem: case TypeAttributes.NestedFamily: TypeDefinition declaringType = metadataReader.GetTypeDefinition(typeDefinition.GetDeclaringType()); return IsPubliclyVisible(metadataReader, declaringType); case TypeAttributes.NestedFamANDAssem: case TypeAttributes.NestedPrivate: case TypeAttributes.NotPublic: default: return false; } }
/// <summary> /// Get the full name of a Type. /// </summary> private static string GetTypeFullName(MetadataReader metadataReader, TypeDefinition typeDefinition) { string fullName; string typeName = metadataReader.GetString(typeDefinition.Name); string nsName = metadataReader.GetString(typeDefinition.Namespace); // Get the enclosing type if the type is nested TypeDefinitionHandle declaringTypeHandle = typeDefinition.GetDeclaringType(); if (declaringTypeHandle.IsNil) { fullName = string.Format(CultureInfo.InvariantCulture, "{0}.{1}", nsName, typeName); } else { fullName = typeName; while (!declaringTypeHandle.IsNil) { TypeDefinition declaringTypeDef = metadataReader.GetTypeDefinition(declaringTypeHandle); declaringTypeHandle = declaringTypeDef.GetDeclaringType(); if (declaringTypeHandle.IsNil) { fullName = string.Format(CultureInfo.InvariantCulture, "{0}.{1}+{2}", metadataReader.GetString(declaringTypeDef.Namespace), metadataReader.GetString(declaringTypeDef.Name), fullName); } else { fullName = string.Format(CultureInfo.InvariantCulture, "{0}+{1}", metadataReader.GetString(declaringTypeDef.Name), fullName); } } } return fullName; }
private string GetMetadataName(MetadataReader metadataReader, TypeDefinition typeDefinition) { if (typeDefinition.GetDeclaringType().IsNil) { string namespaceName = metadataReader.GetString(typeDefinition.Namespace); string typeName = metadataReader.GetString(typeDefinition.Name); return string.Format("{0}.{1}", namespaceName, typeName); } else { TypeDefinition declaringTypeDefinition = metadataReader.GetTypeDefinition(typeDefinition.GetDeclaringType()); string declaringTypeName = GetMetadataName(metadataReader, declaringTypeDefinition); string name = metadataReader.GetString(typeDefinition.Name); return string.Format("{0}+{1}", declaringTypeName, name); } }