Ejemplo n.º 1
0
        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);
            }
        }
Ejemplo n.º 2
0
        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(),
            };
        }