| File: System\Xml\Serialization\XmlAttributes.cs | Web Access |
| Project: src\runtime\src\libraries\System.Private.Xml\src\System.Private.Xml.csproj (System.Private.Xml) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System.ComponentModel; using System.Reflection; namespace System.Xml.Serialization { internal enum XmlAttributeFlags { Enum = 0x1, Array = 0x2, Text = 0x4, ArrayItems = 0x8, Elements = 0x10, Attribute = 0x20, Root = 0x40, Type = 0x80, AnyElements = 0x100, AnyAttribute = 0x200, ChoiceIdentifier = 0x400, XmlnsDeclarations = 0x800, } /// <devdoc> /// <para>[To be supplied.]</para> /// </devdoc> public class XmlAttributes { private readonly XmlElementAttributes _xmlElements = new XmlElementAttributes(); private readonly XmlArrayItemAttributes _xmlArrayItems = new XmlArrayItemAttributes(); private readonly XmlAnyElementAttributes _xmlAnyElements = new XmlAnyElementAttributes(); private XmlArrayAttribute? _xmlArray; private XmlAttributeAttribute? _xmlAttribute; private XmlTextAttribute? _xmlText; private XmlEnumAttribute? _xmlEnum; private bool _xmlIgnore; private bool _xmlns; private object? _xmlDefaultValue; private XmlRootAttribute? _xmlRoot; private XmlTypeAttribute? _xmlType; private XmlAnyAttributeAttribute? _xmlAnyAttribute; private readonly XmlChoiceIdentifierAttribute? _xmlChoiceIdentifier; /// <devdoc> /// <para>[To be supplied.]</para> /// </devdoc> public XmlAttributes() { } internal XmlAttributeFlags XmlFlags { get { XmlAttributeFlags flags = 0; if (_xmlElements.Count > 0) flags |= XmlAttributeFlags.Elements; if (_xmlArrayItems.Count > 0) flags |= XmlAttributeFlags.ArrayItems; if (_xmlAnyElements.Count > 0) flags |= XmlAttributeFlags.AnyElements; if (_xmlArray != null) flags |= XmlAttributeFlags.Array; if (_xmlAttribute != null) flags |= XmlAttributeFlags.Attribute; if (_xmlText != null) flags |= XmlAttributeFlags.Text; if (_xmlEnum != null) flags |= XmlAttributeFlags.Enum; if (_xmlRoot != null) flags |= XmlAttributeFlags.Root; if (_xmlType != null) flags |= XmlAttributeFlags.Type; if (_xmlAnyAttribute != null) flags |= XmlAttributeFlags.AnyAttribute; if (_xmlChoiceIdentifier != null) flags |= XmlAttributeFlags.ChoiceIdentifier; if (_xmlns) flags |= XmlAttributeFlags.XmlnsDeclarations; return flags; } } /// <devdoc> /// <para>[To be supplied.]</para> /// </devdoc> public XmlAttributes(ICustomAttributeProvider provider) { ArgumentNullException.ThrowIfNull(provider); object[] attrs = provider.GetCustomAttributes(false); // most generic <any/> matches everything XmlAnyElementAttribute? wildcard = null; for (int i = 0; i < attrs.Length; i++) { if (attrs[i] is XmlIgnoreAttribute) { _xmlIgnore = true; break; } else if (attrs[i] is ObsoleteAttribute obsoleteAttr) { if (!System.Xml.LocalAppContextSwitches.IgnoreObsoleteMembers) { if (obsoleteAttr.IsError) { throw new InvalidOperationException(SR.Format(SR.XmlObsoleteIsError, obsoleteAttr.Message)); } // If IsError is false, continue processing normally (don't ignore) } else { // Old behavior: ignore obsolete members when switch is enabled _xmlIgnore = true; break; } } else if (attrs[i] is XmlElementAttribute) { _xmlElements.Add((XmlElementAttribute)attrs[i]); } else if (attrs[i] is XmlArrayItemAttribute) { _xmlArrayItems.Add((XmlArrayItemAttribute)attrs[i]); } else if (attrs[i] is XmlAnyElementAttribute any) { if (string.IsNullOrEmpty(any.Name) && any.GetNamespaceSpecified() && any.Namespace == null) { // ignore duplicate wildcards wildcard = any; } else { _xmlAnyElements.Add((XmlAnyElementAttribute)attrs[i]); } } else if (attrs[i] is DefaultValueAttribute) { _xmlDefaultValue = ((DefaultValueAttribute)attrs[i]).Value; } else if (attrs[i] is XmlAttributeAttribute) { _xmlAttribute = (XmlAttributeAttribute)attrs[i]; } else if (attrs[i] is XmlArrayAttribute) { _xmlArray = (XmlArrayAttribute)attrs[i]; } else if (attrs[i] is XmlTextAttribute) { _xmlText = (XmlTextAttribute)attrs[i]; } else if (attrs[i] is XmlEnumAttribute) { _xmlEnum = (XmlEnumAttribute)attrs[i]; } else if (attrs[i] is XmlRootAttribute) { _xmlRoot = (XmlRootAttribute)attrs[i]; } else if (attrs[i] is XmlTypeAttribute) { _xmlType = (XmlTypeAttribute)attrs[i]; } else if (attrs[i] is XmlAnyAttributeAttribute) { _xmlAnyAttribute = (XmlAnyAttributeAttribute)attrs[i]; } else if (attrs[i] is XmlChoiceIdentifierAttribute) { _xmlChoiceIdentifier = (XmlChoiceIdentifierAttribute)attrs[i]; } else if (attrs[i] is XmlNamespaceDeclarationsAttribute) { _xmlns = true; } } if (_xmlIgnore) { _xmlElements.Clear(); _xmlArrayItems.Clear(); _xmlAnyElements.Clear(); _xmlDefaultValue = null; _xmlAttribute = null; _xmlArray = null; _xmlText = null; _xmlEnum = null; _xmlType = null; _xmlAnyAttribute = null; _xmlChoiceIdentifier = null; _xmlns = false; } else { if (wildcard != null) { _xmlAnyElements.Add(wildcard); } } } internal static object? GetAttr(MemberInfo memberInfo, Type attrType) { object[] attrs = memberInfo.GetCustomAttributes(attrType, false); if (attrs.Length == 0) return null; return attrs[0]; } /// <devdoc> /// <para>[To be supplied.]</para> /// </devdoc> public XmlElementAttributes XmlElements { get { return _xmlElements; } } /// <devdoc> /// <para>[To be supplied.]</para> /// </devdoc> public XmlAttributeAttribute? XmlAttribute { get { return _xmlAttribute; } set { _xmlAttribute = value; } } /// <devdoc> /// <para>[To be supplied.]</para> /// </devdoc> public XmlEnumAttribute? XmlEnum { get { return _xmlEnum; } set { _xmlEnum = value; } } /// <devdoc> /// <para>[To be supplied.]</para> /// </devdoc> public XmlTextAttribute? XmlText { get { return _xmlText; } set { _xmlText = value; } } /// <devdoc> /// <para>[To be supplied.]</para> /// </devdoc> public XmlArrayAttribute? XmlArray { get { return _xmlArray; } set { _xmlArray = value; } } /// <devdoc> /// <para>[To be supplied.]</para> /// </devdoc> public XmlArrayItemAttributes XmlArrayItems { get { return _xmlArrayItems; } } /// <devdoc> /// <para>[To be supplied.]</para> /// </devdoc> public object? XmlDefaultValue { get { return _xmlDefaultValue; } set { _xmlDefaultValue = value; } } /// <devdoc> /// <para>[To be supplied.]</para> /// </devdoc> public bool XmlIgnore { get { return _xmlIgnore; } set { _xmlIgnore = value; } } /// <devdoc> /// <para>[To be supplied.]</para> /// </devdoc> public XmlTypeAttribute? XmlType { get { return _xmlType; } set { _xmlType = value; } } /// <devdoc> /// <para>[To be supplied.]</para> /// </devdoc> public XmlRootAttribute? XmlRoot { get { return _xmlRoot; } set { _xmlRoot = value; } } /// <devdoc> /// <para>[To be supplied.]</para> /// </devdoc> public XmlAnyElementAttributes XmlAnyElements { get { return _xmlAnyElements; } } /// <devdoc> /// <para>[To be supplied.]</para> /// </devdoc> public XmlAnyAttributeAttribute? XmlAnyAttribute { get { return _xmlAnyAttribute; } set { _xmlAnyAttribute = value; } } public XmlChoiceIdentifierAttribute? XmlChoiceIdentifier { get { return _xmlChoiceIdentifier; } } /// <devdoc> /// <para>[To be supplied.]</para> /// </devdoc> public bool Xmlns { get { return _xmlns; } set { _xmlns = value; } } } }