System.Xml.Serialization.SerializationCodeGenerator.GenerateReadAttributeMembers C# (CSharp) Method

GenerateReadAttributeMembers() private method

private GenerateReadAttributeMembers ( XmlMapping xmlMap, ClassMap map, string ob, bool isValueList, bool &first ) : void
xmlMap XmlMapping
map ClassMap
ob string
isValueList bool
first bool
return void
		void GenerateReadAttributeMembers (XmlMapping xmlMap, ClassMap map, string ob, bool isValueList, ref bool first)
		{
			XmlTypeMapping typeMap = xmlMap as XmlTypeMapping;
			Type xmlMapType = (typeMap != null) ? typeMap.TypeData.Type : typeof(object[]);

			if (GenerateReadHook (HookType.attributes, xmlMapType))
				return;

			XmlTypeMapMember anyAttrMember = map.DefaultAnyAttributeMember;
			
			if (anyAttrMember != null)
			{
				WriteLine ("int anyAttributeIndex = 0;");
				WriteLine (anyAttrMember.TypeData.CSharpFullName + " anyAttributeArray = null;");
			}
			
			WriteLine ("while (Reader.MoveToNextAttribute())");
			WriteLineInd ("{");
			first = true;
			if (map.AttributeMembers != null) {
				foreach (XmlTypeMapMemberAttribute at in map.AttributeMembers)
				{
					WriteLineInd ((first?"":"else ") + "if (Reader.LocalName == " + GetLiteral (at.AttributeName) + " && Reader.NamespaceURI == " + GetLiteral (at.Namespace) + ") {");
					if (!GenerateReadMemberHook (xmlMapType, at)) {
						GenerateSetMemberValue (at, ob, GenerateGetValueFromXmlString ("Reader.Value", at.TypeData, at.MappedType, false), isValueList);
						GenerateEndHook ();
					}
					WriteLineUni ("}");
					first = false;
				}
			}
			WriteLineInd ((first?"":"else ") + "if (IsXmlnsAttribute (Reader.Name)) {");

			// If the map has NamespaceDeclarations,
			// then store this xmlns to the given member.
			// If the instance doesn't exist, then create.
			
			if (map.NamespaceDeclarations != null) {
				if (!GenerateReadMemberHook (xmlMapType, map.NamespaceDeclarations)) {
					string nss = ob + ".@" + map.NamespaceDeclarations.Name;
					WriteLine ("if (" + nss + " == null) " + nss + " = new XmlSerializerNamespaces ();");
					WriteLineInd ("if (Reader.Prefix == \"xmlns\")");
					WriteLine (nss + ".Add (Reader.LocalName, Reader.Value);");
					Unindent ();
					WriteLineInd ("else");
					WriteLine (nss + ".Add (\"\", Reader.Value);");
					Unindent ();
					GenerateEndHook ();
				}
			}
			
			WriteLineUni ("}");
			WriteLineInd ("else {");

			if (anyAttrMember != null) 
			{
				if (!GenerateReadArrayMemberHook (xmlMapType, anyAttrMember, "anyAttributeIndex")) {
					WriteLine ("System.Xml.XmlAttribute attr = (System.Xml.XmlAttribute) Document.ReadNode(Reader);");
					if (typeof(System.Xml.Schema.XmlSchemaAnnotated).IsAssignableFrom (xmlMapType)) 
						WriteLine ("ParseWsdlArrayType (attr);");
					GenerateAddListValue (anyAttrMember.TypeData, "anyAttributeArray", "anyAttributeIndex", GetCast (anyAttrMember.TypeData.ListItemTypeData, "attr"), true);
					GenerateEndHook ();
				}
				WriteLine ("anyAttributeIndex++;");
			}
			else {
				if (!GenerateReadHook (HookType.unknownAttribute, xmlMapType)) {
					WriteLine ("UnknownNode (" + ob + ");");
					GenerateEndHook ();
				}
			}

			WriteLineUni ("}");
			WriteLineUni ("}");

			if (anyAttrMember != null && !MemberHasReadReplaceHook (xmlMapType, anyAttrMember))
			{
				WriteLine ("");
				WriteLine("anyAttributeArray = (" + anyAttrMember.TypeData.CSharpFullName + ") ShrinkArray (anyAttributeArray, anyAttributeIndex, " + GetTypeOf(anyAttrMember.TypeData.Type.GetElementType()) + ", true);");
				GenerateSetMemberValue (anyAttrMember, ob, "anyAttributeArray", isValueList);
			}
			WriteLine ("");
			WriteLine ("Reader.MoveToElement ();");

			GenerateEndHook ();
		}
		
SerializationCodeGenerator