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;
}