private static String NonQualifiedTypeName(this Type type) { RuntimeType runtimeType = type as RuntimeType; if (runtimeType == null) { return(null); } if (runtimeType.HasElementType) { String elementTypeName = runtimeType.InternalRuntimeElementType.NonQualifiedTypeName(); if (elementTypeName == null) { return(null); } String suffix; if (runtimeType.IsArray) { int rank = runtimeType.GetArrayRank(); if (rank == 1) { suffix = "[" + (runtimeType.InternalIsMultiDimArray ? "*" : "") + "]"; } else { suffix = "[" + new String(',', rank - 1) + "]"; } } else if (runtimeType.IsByRef) { suffix = "&"; } else if (runtimeType.IsPointer) { suffix = "*"; } else { return(null); } return(elementTypeName + suffix); } else if (runtimeType.IsGenericParameter) { return(null); } else if (runtimeType.IsConstructedGenericType) { StringBuilder sb = new StringBuilder(); String genericTypeDefinitionTypeName = runtimeType.GetGenericTypeDefinition().NonQualifiedTypeName(); if (genericTypeDefinitionTypeName == null) { return(null); } sb.Append(genericTypeDefinitionTypeName); sb.Append("["); String sep = ""; foreach (RuntimeType ga in runtimeType.InternalRuntimeGenericTypeArguments) { String gaTypeName = ga.AssemblyQualifiedTypeName(); if (gaTypeName == null) { return(null); } sb.Append(sep + "[" + gaTypeName + "]"); sep = ","; } sb.Append("]"); return(sb.ToString()); } else { RuntimeNamedTypeInfo runtimeNamedTypeInfo = type.GetTypeInfo() as RuntimeNamedTypeInfo; if (runtimeNamedTypeInfo == null) { return(null); } MetadataReader reader = runtimeNamedTypeInfo.Reader; String s = ""; TypeDefinitionHandle typeDefinitionHandle = runtimeNamedTypeInfo.TypeDefinitionHandle; NamespaceDefinitionHandle namespaceDefinitionHandle; do { TypeDefinition typeDefinition = typeDefinitionHandle.GetTypeDefinition(reader); String name = typeDefinition.Name.GetString(reader); if (s == "") { s = name; } else { s = name + "+" + s; } namespaceDefinitionHandle = typeDefinition.NamespaceDefinition; typeDefinitionHandle = typeDefinition.EnclosingType; }while (!typeDefinitionHandle.IsNull(reader)); NamespaceChain namespaceChain = new NamespaceChain(reader, namespaceDefinitionHandle); String ns = namespaceChain.NameSpace; if (ns != null) { s = ns + "." + s; } return(s); } }
protected void InitializeContentDefinition(ICustomAttributeProvider sourceInfo) { var elementAttribute = sourceInfo.GetSingleAttribute <XmlElementAttribute>(); var arrayAttribute = sourceInfo.GetSingleAttribute <XmlArrayAttribute>(); var arrayItemAttribute = sourceInfo.GetSingleAttribute <XmlArrayItemAttribute>(); if (elementAttribute != null && (arrayAttribute != null || arrayItemAttribute != null)) { throw new Exception($"Property `{this}` should not define XmlElement and XmlArray(Item) attributes at the same time."); } var runtimeName = RuntimeName; XName qualifiedName = null; XName itemQualifiedName = null; if (RuntimeType.IsArray) { if (RuntimeType.GetArrayRank() > 1) { throw new Exception($"Property `{this}` declares multi-dimensional array, which is not supported."); } var localName = (arrayAttribute?.ElementName).GetValueOrDefault(runtimeName); var containerName = string.IsNullOrWhiteSpace(localName) ? null : XName.Get(localName, arrayAttribute?.Namespace ?? ""); if (elementAttribute != null) { itemQualifiedName = XName.Get(elementAttribute.ElementName.GetValueOrDefault(runtimeName), elementAttribute.Namespace ?? ""); } else if (arrayItemAttribute != null) { qualifiedName = containerName; itemQualifiedName = XName.Get(arrayItemAttribute.ElementName.GetValueOrDefault(runtimeName), arrayItemAttribute.Namespace ?? ""); } else { qualifiedName = containerName; itemQualifiedName = XName.Get("item", ""); } } else { if (arrayAttribute != null || arrayItemAttribute != null) { throw new Exception($"Property `{this}` should not define XmlArray(Item) attribute, because it's not array type."); } var name = (elementAttribute?.ElementName).GetValueOrDefault(runtimeName); qualifiedName = string.IsNullOrWhiteSpace(name) ? null : XName.Get(name, elementAttribute?.Namespace ?? ""); } var customTypeName = (elementAttribute?.DataType).GetValueOrDefault(arrayItemAttribute?.DataType); Name = qualifiedName; IsNullable = (elementAttribute?.IsNullable).GetValueOrDefault() || (arrayAttribute?.IsNullable).GetValueOrDefault(); Order = (elementAttribute?.Order).GetValueOrDefault((arrayAttribute?.Order).GetValueOrDefault()); UseXop = typeof(Stream).GetTypeInfo().IsAssignableFrom(RuntimeType); TypeName = customTypeName != null?XName.Get(customTypeName, NamespaceConstants.XSD) : null; IsOptional = sourceInfo.GetSingleAttribute <XRoadOptionalAttribute>() != null; State = DefinitionState.Default; Documentation = sourceInfo.GetXRoadTitles().Where(title => !string.IsNullOrWhiteSpace(title.Item2)).ToArray(); MergeContent = sourceInfo.GetSingleAttribute <XRoadMergeContentAttribute>() != null || sourceInfo.GetSingleAttribute <XmlTextAttribute>() != null; if (!RuntimeType.IsArray) { return; } MergeContent = MergeContent || elementAttribute != null; ArrayItemDefinition = new ArrayItemDefinition(this) { Name = itemQualifiedName, IsNullable = (arrayItemAttribute?.IsNullable).GetValueOrDefault(), IsOptional = elementAttribute != null && IsOptional, UseXop = typeof(Stream).GetTypeInfo().IsAssignableFrom(RuntimeType.GetElementType()), RuntimeType = RuntimeType.GetElementType(), }; }