static internal XmlReflectionMember GetXmlReflectionMember()

in src/System.ServiceModel.Primitives/src/System/ServiceModel/Description/XmlSerializerOperationBehavior.cs [1058:1227]


        static internal XmlReflectionMember GetXmlReflectionMember(XmlName memberName, XmlName elementName, string ns, Type type, ICustomAttributeProvider additionalAttributesProvider, bool isMultiple, bool isEncoded, bool isWrapped)
        {
            if (isEncoded && isMultiple)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SRP.Format(SRP.SFxMultiplePartsNotAllowedInEncoded, elementName.DecodedName, ns)));
            }

            XmlReflectionMember member = new XmlReflectionMember();
            member.MemberName = (memberName ?? elementName).DecodedName;
            member.MemberType = type;
            if (member.MemberType.IsByRef)
            {
                member.MemberType = member.MemberType.GetElementType();
            }

            if (isMultiple)
            {
                member.MemberType = member.MemberType.MakeArrayType();
            }

            if (additionalAttributesProvider != null)
            {
                if (isEncoded)
                {
                    member.SoapAttributes = new SoapAttributes(additionalAttributesProvider);
                }
                else
                {
                    member.XmlAttributes = new XmlAttributes(additionalAttributesProvider);
                }
            }

            if (isEncoded)
            {
                if (member.SoapAttributes == null)
                {
                    member.SoapAttributes = new SoapAttributes();
                }
                else
                {
                    Type invalidAttributeType = null;
                    if (member.SoapAttributes.SoapAttribute != null)
                    {
                        invalidAttributeType = typeof(SoapAttributeAttribute);
                    }
                    else if (member.SoapAttributes.SoapIgnore)
                    {
                        invalidAttributeType = typeof(SoapIgnoreAttribute);
                    }
                    else if (member.SoapAttributes.SoapType != null)
                    {
                        invalidAttributeType = typeof(SoapTypeAttribute);
                    }

                    if (invalidAttributeType != null)
                    {
                        throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SRP.Format(SRP.SFxInvalidSoapAttribute, invalidAttributeType, elementName.DecodedName)));
                    }
                }

                if (member.SoapAttributes.SoapElement == null)
                {
                    member.SoapAttributes.SoapElement = new SoapElementAttribute(elementName.DecodedName);
                }
            }
            else
            {
                if (member.XmlAttributes == null)
                {
                    member.XmlAttributes = new XmlAttributes();
                }
                else
                {
                    Type invalidAttributeType = null;
                    if (member.XmlAttributes.XmlAttribute != null)
                    {
                        invalidAttributeType = typeof(XmlAttributeAttribute);
                    }
                    else if (member.XmlAttributes.XmlAnyAttribute != null && !isWrapped)
                    {
                        invalidAttributeType = typeof(XmlAnyAttributeAttribute);
                    }
                    else if (member.XmlAttributes.XmlChoiceIdentifier != null)
                    {
                        invalidAttributeType = typeof(XmlChoiceIdentifierAttribute);
                    }
                    else if (member.XmlAttributes.XmlIgnore)
                    {
                        invalidAttributeType = typeof(XmlIgnoreAttribute);
                    }
                    else if (member.XmlAttributes.Xmlns)
                    {
                        invalidAttributeType = typeof(XmlNamespaceDeclarationsAttribute);
                    }
                    else if (member.XmlAttributes.XmlText != null)
                    {
                        invalidAttributeType = typeof(XmlTextAttribute);
                    }
                    else if (member.XmlAttributes.XmlEnum != null)
                    {
                        invalidAttributeType = typeof(XmlEnumAttribute);
                    }

                    if (invalidAttributeType != null)
                    {
                        throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SRP.Format(isWrapped ? SRP.SFxInvalidXmlAttributeInWrapped : SRP.SFxInvalidXmlAttributeInBare, invalidAttributeType, elementName.DecodedName)));
                    }

                    if (member.XmlAttributes.XmlArray != null && isMultiple)
                    {
                        throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SRP.Format(SRP.SFxXmlArrayNotAllowedForMultiple, elementName.DecodedName, ns)));
                    }
                }


                bool isArray = member.MemberType.IsArray;
                if ((isArray && !isMultiple && member.MemberType != typeof(byte[])) ||
                   (!isArray && typeof(IEnumerable).IsAssignableFrom(member.MemberType) && member.MemberType != typeof(string) && !typeof(XmlNode).IsAssignableFrom(member.MemberType) && !typeof(IXmlSerializable).IsAssignableFrom(member.MemberType)))
                {
                    if (member.XmlAttributes.XmlArray != null)
                    {
                        if (member.XmlAttributes.XmlArray.ElementName == String.Empty)
                        {
                            member.XmlAttributes.XmlArray.ElementName = elementName.DecodedName;
                        }

                        if (member.XmlAttributes.XmlArray.Namespace == null)
                        {
                            member.XmlAttributes.XmlArray.Namespace = ns;
                        }
                    }
                    else if (HasNoXmlParameterAttributes(member.XmlAttributes))
                    {
                        member.XmlAttributes.XmlArray = new XmlArrayAttribute();
                        member.XmlAttributes.XmlArray.ElementName = elementName.DecodedName;
                        member.XmlAttributes.XmlArray.Namespace = ns;
                    }
                }
                else
                {
                    if (member.XmlAttributes.XmlElements == null || member.XmlAttributes.XmlElements.Count == 0)
                    {
                        if (HasNoXmlParameterAttributes(member.XmlAttributes))
                        {
                            XmlElementAttribute elementAttribute = new XmlElementAttribute();
                            elementAttribute.ElementName = elementName.DecodedName;
                            elementAttribute.Namespace = ns;
                            member.XmlAttributes.XmlElements.Add(elementAttribute);
                        }
                    }
                    else
                    {
                        foreach (XmlElementAttribute elementAttribute in member.XmlAttributes.XmlElements)
                        {
                            if (elementAttribute.ElementName == String.Empty)
                            {
                                elementAttribute.ElementName = elementName.DecodedName;
                            }

                            if (elementAttribute.Namespace == null)
                            {
                                elementAttribute.Namespace = ns;
                            }
                        }
                    }
                }
            }

            return member;
        }