Clone() private method

private Clone ( ) : ElementAccessor
return ElementAccessor
Exemplo n.º 1
0
        void WriteElement(string source, ElementAccessor element, string arrayName, bool writeAccessor) {
            string name = writeAccessor ? element.Name : element.Mapping.TypeName;
            string ns = element.Any && element.Name.Length == 0 ? null : (element.Form == XmlSchemaForm.Qualified ? (writeAccessor ? element.Namespace : element.Mapping.Namespace) : "");
            if (element.Mapping is NullableMapping) {
                Writer.Write("if ("); 
                Writer.Write(source);
                Writer.WriteLine(" != null) {");
                Writer.Indent++;
                string fullTypeName = element.Mapping.TypeDesc.BaseTypeDesc.CSharpName;
                string castedSource = source;
                if (!element.Mapping.TypeDesc.BaseTypeDesc.UseReflection)
                    castedSource = "(("+fullTypeName+")"+ source+")";
                ElementAccessor e = element.Clone();
                e.Mapping = ((NullableMapping)element.Mapping).BaseMapping;
                WriteElement(e.Any ? source : castedSource, e, arrayName, writeAccessor);
                Writer.Indent--;
                Writer.WriteLine("}");
                if (element.IsNullable) {
                    Writer.WriteLine("else {");
                    Writer.Indent++;
                    WriteLiteralNullTag(element.Name, element.Form == XmlSchemaForm.Qualified ? element.Namespace : "");
                    Writer.Indent--;
                    Writer.WriteLine("}");
                }
            }
            else if (element.Mapping is ArrayMapping) {
                ArrayMapping mapping = (ArrayMapping)element.Mapping;
                if (mapping.IsSoap) {
                    Writer.Write("WritePotentiallyReferencingElement(");
                    WriteQuotedCSharpString(name);
                    Writer.Write(", ");
                    WriteQuotedCSharpString(ns);
                    Writer.Write(", ");
                    Writer.Write(source);
                    if (!writeAccessor) {
                        Writer.Write(", ");
                        Writer.Write(RaCodeGen.GetStringForTypeof(mapping.TypeDesc.CSharpName, mapping.TypeDesc.UseReflection));
                        Writer.Write(", true, ");
                    }
                    else {
                        Writer.Write(", null, false, ");
                    }
                    WriteValue(element.IsNullable);
                    Writer.WriteLine(");");
                }
                else if (element.IsUnbounded) {
                    TypeDesc td = mapping.TypeDesc.CreateArrayTypeDesc();
                    string fullTypeName = td.CSharpName;
                    string elementArrayName = "el" + arrayName;
                    string arrayIndex = "c" + elementArrayName;
                    Writer.WriteLine("{");
                    Writer.Indent++;
                    WriteArrayLocalDecl(fullTypeName, elementArrayName, source, mapping.TypeDesc);
                    if (element.IsNullable) {
                        WriteNullCheckBegin(elementArrayName, element);
                    }
                    else {
                        if (mapping.TypeDesc.IsNullable) {
                            Writer.Write("if (");
                            Writer.Write(elementArrayName);
                            Writer.Write(" != null)");
                        }
                        Writer.WriteLine("{");
                        Writer.Indent++;
                    }

                    Writer.Write("for (int ");
                    Writer.Write(arrayIndex);
                    Writer.Write(" = 0; ");
                    Writer.Write(arrayIndex);
                    Writer.Write(" < ");

                    if (td.IsArray) {
                        Writer.Write(elementArrayName);
                        Writer.Write(".Length");
                    }
                    else {
                        Writer.Write("((");
                        Writer.Write(typeof(ICollection).FullName);
                        Writer.Write(")");
                        Writer.Write(elementArrayName);
                        Writer.Write(").Count");
                    }
                    Writer.Write("; ");
                    Writer.Write(arrayIndex);
                    Writer.WriteLine("++) {");
                    Writer.Indent++;

                    element.IsUnbounded = false;
                    WriteElement(elementArrayName + "[" + arrayIndex + "]", element, arrayName, writeAccessor);
                    element.IsUnbounded = true;

                    Writer.Indent--;
                    Writer.WriteLine("}");

                    Writer.Indent--;
                    Writer.WriteLine("}");
                    Writer.Indent--;
                    Writer.WriteLine("}");
                }
                else {
                    string fullTypeName = mapping.TypeDesc.CSharpName;
                    Writer.WriteLine("{");
                    Writer.Indent++;
                    WriteArrayLocalDecl(fullTypeName, arrayName, source, mapping.TypeDesc);
                    if (element.IsNullable) {
                        WriteNullCheckBegin(arrayName, element);
                    }
                    else {
                        if (mapping.TypeDesc.IsNullable) {
                            Writer.Write("if (");
                            Writer.Write(arrayName);
                            Writer.Write(" != null)");
                        }
                        Writer.WriteLine("{");
                        Writer.Indent++;
                    }
                    WriteStartElement(name, ns, false);
                    WriteArrayItems(mapping.ElementsSortedByDerivation, null, null, mapping.TypeDesc, arrayName, null);
                    WriteEndElement();
                    Writer.Indent--;
                    Writer.WriteLine("}");
                    Writer.Indent--;
                    Writer.WriteLine("}");
                }
            }
            else if (element.Mapping is EnumMapping) {
                if (element.Mapping.IsSoap) {
                    string methodName = (string)MethodNames[element.Mapping];
                    Writer.Write("Writer.WriteStartElement(");
                    WriteQuotedCSharpString(name);
                    Writer.Write(", ");
                    WriteQuotedCSharpString(ns);
                    Writer.WriteLine(");");
                    Writer.Write(methodName);
                    Writer.Write("(");
                    Writer.Write(source);
                    Writer.WriteLine(");");
                    WriteEndElement();
                }
                else {
                    WritePrimitive("WriteElementString", name, ns, element.Default, source, element.Mapping, false, true, element.IsNullable);
                }
            }
            else if (element.Mapping is PrimitiveMapping) {
                PrimitiveMapping mapping = (PrimitiveMapping)element.Mapping;
                if (mapping.TypeDesc == QnameTypeDesc)
                    WriteQualifiedNameElement(name, ns, element.Default, source, element.IsNullable, mapping.IsSoap, mapping);
                else {
                    string suffixNullable = mapping.IsSoap ? "Encoded" : "Literal";
                    string suffixRaw = mapping.TypeDesc.XmlEncodingNotRequired?"Raw":"";
                    WritePrimitive(element.IsNullable ? ("WriteNullableString" + suffixNullable + suffixRaw) : ("WriteElementString" + suffixRaw),
                                   name, ns, element.Default, source, mapping, mapping.IsSoap, true, element.IsNullable);
                }
            }
            else if (element.Mapping is StructMapping) {
                StructMapping mapping = (StructMapping)element.Mapping;

                if (mapping.IsSoap) {
                    Writer.Write("WritePotentiallyReferencingElement(");
                    WriteQuotedCSharpString(name);
                    Writer.Write(", ");
                    WriteQuotedCSharpString(ns);
                    Writer.Write(", ");
                    Writer.Write(source);
                    if (!writeAccessor) {
                        Writer.Write(", ");
                        Writer.Write(RaCodeGen.GetStringForTypeof(mapping.TypeDesc.CSharpName, mapping.TypeDesc.UseReflection));
                        Writer.Write(", true, ");
                    }
                    else {
                        Writer.Write(", null, false, ");
                    }
                    WriteValue(element.IsNullable);
                }
                else {
                    string methodName = ReferenceMapping(mapping);

                    #if DEBUG
                        // use exception in the place of Debug.Assert to avoid throwing asserts from a server process such as aspnet_ewp.exe
                        if (methodName == null) throw new InvalidOperationException(Res.GetString(Res.XmlInternalErrorMethod, mapping.TypeDesc.Name) + Environment.StackTrace);
                    #endif
                    Writer.Write(methodName);
                    Writer.Write("(");
                    WriteQuotedCSharpString(name);
                    Writer.Write(", ");
                    if (ns == null)
                        Writer.Write("null");
                    else {
                        WriteQuotedCSharpString(ns);
                    }
                    Writer.Write(", ");
                    Writer.Write(source);
                    if (mapping.TypeDesc.IsNullable) {
                        Writer.Write(", ");
                        WriteValue(element.IsNullable);
                    }
                    Writer.Write(", false");
                }
                Writer.WriteLine(");");
            }
            else if (element.Mapping is SpecialMapping) {
                SpecialMapping mapping = (SpecialMapping)element.Mapping;
                bool useReflection = mapping.TypeDesc.UseReflection;
                TypeDesc td = mapping.TypeDesc;
                string fullTypeName = td.CSharpName;


                if (element.Mapping is SerializableMapping) {
                    WriteElementCall("WriteSerializable", typeof(IXmlSerializable), source, name, ns, element.IsNullable, !element.Any);
                }
                else {
                    // XmlNode, XmlElement
                    Writer.Write("if ((");
                    Writer.Write(source);
                    Writer.Write(") is ");
                    Writer.Write(typeof(XmlNode).FullName);
                    Writer.Write(" || ");
                    Writer.Write(source);
                    Writer.Write(" == null");
                    Writer.WriteLine(") {");
                    Writer.Indent++;

                    WriteElementCall("WriteElementLiteral", typeof(XmlNode), source, name, ns, element.IsNullable, element.Any);

                    Writer.Indent--;
                    Writer.WriteLine("}");
                    Writer.WriteLine("else {");
                    Writer.Indent++;

                    Writer.Write("throw CreateInvalidAnyTypeException(");
                    Writer.Write(source);
                    Writer.WriteLine(");");

                    Writer.Indent--;
                    Writer.WriteLine("}");
                }
            }
            else {
                throw new InvalidOperationException(Res.GetString(Res.XmlInternalError));
            }
        }
Exemplo n.º 2
0
        private void WriteElement(object o, ElementAccessor element, string arrayName, bool writeAccessor, XmlMapping parentMapping = null)
        {
            string name = writeAccessor ? element.Name : element.Mapping.TypeName;
            string ns   = element.Any && element.Name.Length == 0 ? null : (element.Form == XmlSchemaForm.Qualified ? (writeAccessor ? element.Namespace : element.Mapping.Namespace) : "");

            if (element.Mapping is NullableMapping)
            {
                if (o != null)
                {
                    ElementAccessor e = element.Clone();
                    e.Mapping = ((NullableMapping)element.Mapping).BaseMapping;
                    WriteElement(o, e, arrayName, writeAccessor);
                }
                else if (element.IsNullable)
                {
                    WriteNullTagLiteral(element.Name, ns);
                }
            }
            else if (element.Mapping is ArrayMapping)
            {
                var mapping = (ArrayMapping)element.Mapping;
                if (mapping.IsSoap)
                {
                    throw new PlatformNotSupportedException();
                }

                if (element.IsNullable && o == null)
                {
                    WriteNullTagLiteral(element.Name, element.Form == XmlSchemaForm.Qualified ? element.Namespace : "");
                }
                else
                {
                    if (element.IsUnbounded)
                    {
                        TypeDesc arrayTypeDesc = mapping.TypeDesc.CreateArrayTypeDesc();

                        var enumerable = (IEnumerable)o;
                        foreach (var e in enumerable)
                        {
                            element.IsUnbounded = false;
                            WriteElement(e, element, arrayName, writeAccessor);
                            element.IsUnbounded = true;
                        }
                    }
                    else
                    {
                        if (o != null)
                        {
                            WriteStartElement(name, ns, false);
                            WriteArrayItems(mapping.ElementsSortedByDerivation, null, null, mapping.TypeDesc, o);
                            WriteEndElement();
                        }
                    }
                }
            }
            else if (element.Mapping is EnumMapping)
            {
                if (element.Mapping.IsSoap)
                {
                    Writer.WriteStartElement(name, ns);
                    WriteEnumMethod((EnumMapping)element.Mapping, o);
                    WriteEndElement();
                }
                else
                {
                    WritePrimitive(WritePrimitiveMethodRequirement.WriteElementString, name, ns, element.Default, o, element.Mapping, false, true, element.IsNullable);
                }
            }
            else if (element.Mapping is PrimitiveMapping)
            {
                PrimitiveMapping mapping = (PrimitiveMapping)element.Mapping;
                if (mapping.TypeDesc == QnameTypeDesc)
                {
                    WriteQualifiedNameElement(name, ns, element.Default, (XmlQualifiedName)o, element.IsNullable, mapping.IsSoap, mapping);
                }
                else
                {
                    WritePrimitiveMethodRequirement suffixNullable = mapping.IsSoap ? WritePrimitiveMethodRequirement.Encoded : WritePrimitiveMethodRequirement.None;
                    WritePrimitiveMethodRequirement suffixRaw      = mapping.TypeDesc.XmlEncodingNotRequired ? WritePrimitiveMethodRequirement.Raw : WritePrimitiveMethodRequirement.None;
                    WritePrimitive(element.IsNullable
                        ? WritePrimitiveMethodRequirement.WriteNullableStringLiteral | suffixNullable | suffixRaw
                        : WritePrimitiveMethodRequirement.WriteElementString | suffixRaw,
                                   name, ns, element.Default, o, mapping, mapping.IsSoap, true, element.IsNullable);
                }
            }
            else if (element.Mapping is StructMapping)
            {
                var mapping = (StructMapping)element.Mapping;
                if (mapping.IsSoap)
                {
                    EnsureXmlSerializationWriteCallbackForMapping(mapping, name, ns, element.IsNullable, needType: false, parentMapping: parentMapping);
                    WritePotentiallyReferencingElement(name, ns, o, !writeAccessor ? mapping.TypeDesc.Type : null, !writeAccessor, element.IsNullable);
                }
                else
                {
                    WriteStructMethod(mapping, name, ns, o, element.IsNullable, needType: false, parentMapping: parentMapping);
                }
            }
            else if (element.Mapping is SpecialMapping)
            {
                if (element.Mapping is SerializableMapping)
                {
                    WriteSerializable((IXmlSerializable)o, name, ns, element.IsNullable, !element.Any);
                }
                else
                {
                    // XmlNode, XmlElement
                    var node = o as XmlNode;
                    if (node != null)
                    {
                        WriteElementLiteral(node, name, ns, element.IsNullable, element.Any);
                    }
                    else
                    {
                        throw CreateInvalidAnyTypeException(o);
                    }
                }
            }
            else
            {
                throw new InvalidOperationException(SR.XmlInternalError);
            }
        }
        private void WriteElement(SourceInfo source, ElementAccessor element, string arrayName, bool writeAccessor)
        {
            string name = writeAccessor ? element.Name : element.Mapping.TypeName;
            string ns = element.Any && element.Name.Length == 0 ? null : (element.Form == XmlSchemaForm.Qualified ? (writeAccessor ? element.Namespace : element.Mapping.Namespace) : "");
            if (element.Mapping is NullableMapping)
            {
                if (source.Type == element.Mapping.TypeDesc.Type)
                {
                    MethodInfo Nullable_get_HasValue = element.Mapping.TypeDesc.Type.GetMethod(
                        "get_HasValue",
                        CodeGenerator.InstanceBindingFlags,
                        Array.Empty<Type>()
                        );
                    source.LoadAddress(element.Mapping.TypeDesc.Type);
                    ilg.Call(Nullable_get_HasValue);
                }
                else
                {
                    source.Load(null);
                    ilg.Load(null);
                    ilg.Cne();
                }
                ilg.If();
                string fullTypeName = element.Mapping.TypeDesc.BaseTypeDesc.CSharpName;
                SourceInfo castedSource = source.CastTo(element.Mapping.TypeDesc.BaseTypeDesc);
                ElementAccessor e = element.Clone();
                e.Mapping = ((NullableMapping)element.Mapping).BaseMapping;
                WriteElement(e.Any ? source : castedSource, e, arrayName, writeAccessor);
                if (element.IsNullable)
                {
                    ilg.Else();
                    WriteLiteralNullTag(element.Name, element.Form == XmlSchemaForm.Qualified ? element.Namespace : "");
                }
                ilg.EndIf();
            }
            else if (element.Mapping is ArrayMapping)
            {
                ArrayMapping mapping = (ArrayMapping)element.Mapping;
                if (element.IsUnbounded)
                {
                    throw Globals.NotSupported("Unreachable: IsUnbounded is never set true!");
                }
                else
                {
                    ilg.EnterScope();
                    string fullTypeName = mapping.TypeDesc.CSharpName;
                    WriteArrayLocalDecl(fullTypeName, arrayName, source, mapping.TypeDesc);
                    if (element.IsNullable)
                    {
                        WriteNullCheckBegin(arrayName, element);
                    }
                    else
                    {
                        if (mapping.TypeDesc.IsNullable)
                        {
                            ilg.Ldloc(ilg.GetLocal(arrayName));
                            ilg.Load(null);
                            ilg.If(Cmp.NotEqualTo);
                        }
                    }
                    WriteStartElement(name, ns, false);
                    WriteArrayItems(mapping.ElementsSortedByDerivation, null, null, mapping.TypeDesc, arrayName, null);
                    WriteEndElement();
                    if (element.IsNullable)
                    {
                        ilg.EndIf();
                    }
                    else
                    {
                        if (mapping.TypeDesc.IsNullable)
                        {
                            ilg.EndIf();
                        }
                    }
                    ilg.ExitScope();
                }
            }
            else if (element.Mapping is EnumMapping)
            {
                WritePrimitive("WriteElementString", name, ns, element.Default, source, element.Mapping, false, true, element.IsNullable);
            }
            else if (element.Mapping is PrimitiveMapping)
            {
                PrimitiveMapping mapping = (PrimitiveMapping)element.Mapping;
                if (mapping.TypeDesc == QnameTypeDesc)
                    WriteQualifiedNameElement(name, ns, element.Default, source, element.IsNullable, mapping);
                else
                {
                    string suffixRaw = mapping.TypeDesc.XmlEncodingNotRequired ? "Raw" : "";
                    WritePrimitive(element.IsNullable ? ("WriteNullableStringLiteral" + suffixRaw) : ("WriteElementString" + suffixRaw),
                                   name, ns, element.Default, source, mapping, false, true, element.IsNullable);
                }
            }
            else if (element.Mapping is StructMapping)
            {
                StructMapping mapping = (StructMapping)element.Mapping;

                string methodName = ReferenceMapping(mapping);

#if DEBUG
                // use exception in the place of Debug.Assert to avoid throwing asserts from a server process such as aspnet_ewp.exe
                if (methodName == null) throw new InvalidOperationException(SR.Format(SR.XmlInternalErrorMethod, mapping.TypeDesc.Name));
#endif
                List<Type> argTypes = new List<Type>();
                ilg.Ldarg(0);
                ilg.Ldstr(GetCSharpString(name));
                argTypes.Add(typeof(string));
                ilg.Ldstr(GetCSharpString(ns));
                argTypes.Add(typeof(string));
                source.Load(mapping.TypeDesc.Type);
                argTypes.Add(mapping.TypeDesc.Type);
                if (mapping.TypeDesc.IsNullable)
                {
                    ilg.Ldc(element.IsNullable);
                    argTypes.Add(typeof(Boolean));
                }
                ilg.Ldc(false);
                argTypes.Add(typeof(Boolean));
                MethodBuilder methodBuilder = EnsureMethodBuilder(typeBuilder,
                    methodName,
                    CodeGenerator.PrivateMethodAttributes,
                    typeof(void),
                    argTypes.ToArray());
                ilg.Call(methodBuilder);
            }
            else if (element.Mapping is SpecialMapping)
            {
                SpecialMapping mapping = (SpecialMapping)element.Mapping;
                TypeDesc td = mapping.TypeDesc;
                string fullTypeName = td.CSharpName;


                if (element.Mapping is SerializableMapping)
                {
                    WriteElementCall("WriteSerializable", typeof(IXmlSerializable), source, name, ns, element.IsNullable, !element.Any);
                }
                else
                {
                    // XmlNode, XmlElement
                    Label ifLabel1 = ilg.DefineLabel();
                    Label ifLabel2 = ilg.DefineLabel();
                    source.Load(null);
                    ilg.IsInst(typeof(XmlNode));
                    ilg.Brtrue(ifLabel1);
                    source.Load(null);
                    ilg.Load(null);
                    ilg.Ceq();
                    ilg.Br(ifLabel2);
                    ilg.MarkLabel(ifLabel1);
                    ilg.Ldc(true);
                    ilg.MarkLabel(ifLabel2);
                    ilg.If();

                    WriteElementCall("WriteElementLiteral", typeof(XmlNode), source, name, ns, element.IsNullable, element.Any);

                    ilg.Else();

                    MethodInfo XmlSerializationWriter_CreateInvalidAnyTypeException = typeof(XmlSerializationWriter).GetMethod(
                        "CreateInvalidAnyTypeException",
                        CodeGenerator.InstanceBindingFlags,
                        new Type[] { typeof(Object) }
                        );
                    ilg.Ldarg(0);
                    source.Load(null);
                    ilg.Call(XmlSerializationWriter_CreateInvalidAnyTypeException);
                    ilg.Throw();

                    ilg.EndIf();
                }
            }
            else
            {
                throw new InvalidOperationException(SR.XmlInternalError);
            }
        }
        private void WriteElement(object o, ElementAccessor element, string arrayName, bool writeAccessor, XmlMapping parentMapping = null)
        {
            string name = writeAccessor ? element.Name : element.Mapping.TypeName;
            string ns = element.Any && element.Name.Length == 0 ? null : (element.Form == XmlSchemaForm.Qualified ? (writeAccessor ? element.Namespace : element.Mapping.Namespace) : "");

            if (element.Mapping is NullableMapping)
            {
                if (o != null)
                {
                    ElementAccessor e = element.Clone();
                    e.Mapping = ((NullableMapping)element.Mapping).BaseMapping;
                    WriteElement(o, e, arrayName, writeAccessor);
                }
                else if (element.IsNullable)
                {
                    WriteNullTagLiteral(element.Name, ns);
                }
            }
            else if (element.Mapping is ArrayMapping)
            {
                var mapping = (ArrayMapping)element.Mapping;
                if (mapping.IsSoap)
                {
                    throw new PlatformNotSupportedException();
                }

                if (element.IsNullable && o == null)
                {
                    WriteNullTagLiteral(element.Name, element.Form == XmlSchemaForm.Qualified ? element.Namespace : "");
                }
                else
                {
                    if (element.IsUnbounded)
                    {
                        TypeDesc arrayTypeDesc = mapping.TypeDesc.CreateArrayTypeDesc();

                        var enumerable = (IEnumerable)o;
                        foreach (var e in enumerable)
                        {
                            element.IsUnbounded = false;
                            WriteElement(e, element, arrayName, writeAccessor);
                            element.IsUnbounded = true;
                        }
                    }
                    else
                    {
                        if (o != null)
                        {
                            WriteStartElement(name, ns, false);
                            WriteArrayItems(mapping.ElementsSortedByDerivation, null, null, mapping.TypeDesc, o);
                            WriteEndElement();
                        }
                    }
                }
            }
            else if (element.Mapping is EnumMapping)
            {
                if (element.Mapping.IsSoap)
                {
                    throw new PlatformNotSupportedException();
                }
                else
                {
                    WritePrimitive(WritePrimitiveMethodRequirement.WriteElementString, name, ns, element.Default, o, element.Mapping, false, true, element.IsNullable);
                }
            }
            else if (element.Mapping is PrimitiveMapping)
            {
                PrimitiveMapping mapping = (PrimitiveMapping)element.Mapping;
                if (mapping.TypeDesc == QnameTypeDesc)
                {
                    WriteQualifiedNameElement(name, ns, element.Default, (XmlQualifiedName)o, element.IsNullable, mapping.IsSoap, mapping);
                }
                else
                {
                    if (mapping.IsSoap)
                    {
                        throw new PlatformNotSupportedException();
                    }

                    WritePrimitiveMethodRequirement suffixRaw = mapping.TypeDesc.XmlEncodingNotRequired ? WritePrimitiveMethodRequirement.Raw : WritePrimitiveMethodRequirement.None;
                    WritePrimitive(element.IsNullable
                        ? WritePrimitiveMethodRequirement.WriteNullableStringLiteral | suffixRaw
                        : WritePrimitiveMethodRequirement.WriteElementString | suffixRaw,
                        name, ns, element.Default, o, mapping, mapping.IsSoap, true, element.IsNullable);
                }
            }
            else if (element.Mapping is StructMapping)
            {
                var mapping = (StructMapping)element.Mapping;
                if (mapping.IsSoap)
                {
                    throw new PlatformNotSupportedException();
                }

                WriteStructMethod(mapping, name, ns, o, mapping.TypeDesc.IsNullable, needType: false, parentMapping: parentMapping);
            }
            else if (element.Mapping is SpecialMapping)
            {
                if (element.Mapping is SerializableMapping)
                {
                    WriteSerializable((IXmlSerializable)o, name, ns, element.IsNullable, !element.Any);
                }
                else
                {
                    // XmlNode, XmlElement
                    var node = o as XmlNode;
                    if (node != null)
                    {
                        WriteElementLiteral(node, name, ns, element.IsNullable, element.Any);
                    }
                    else
                    {
                        throw CreateInvalidAnyTypeException(o);
                    }
                }
            }
            else
            {
                throw new InvalidOperationException(SR.XmlInternalError);
            }
        }
 private void WriteElement(string source, ElementAccessor element, string arrayName, bool writeAccessor)
 {
     string str = writeAccessor ? element.Name : element.Mapping.TypeName;
     string str2 = (element.Any && (element.Name.Length == 0)) ? null : ((element.Form == XmlSchemaForm.Qualified) ? (writeAccessor ? element.Namespace : element.Mapping.Namespace) : "");
     if (element.Mapping is NullableMapping)
     {
         base.Writer.Write("if (");
         base.Writer.Write(source);
         base.Writer.WriteLine(" != null) {");
         IndentedWriter writer = base.Writer;
         writer.Indent++;
         string cSharpName = element.Mapping.TypeDesc.BaseTypeDesc.CSharpName;
         string str4 = source;
         if (!element.Mapping.TypeDesc.BaseTypeDesc.UseReflection)
         {
             str4 = "((" + cSharpName + ")" + source + ")";
         }
         ElementAccessor accessor = element.Clone();
         accessor.Mapping = ((NullableMapping) element.Mapping).BaseMapping;
         this.WriteElement(accessor.Any ? source : str4, accessor, arrayName, writeAccessor);
         IndentedWriter writer2 = base.Writer;
         writer2.Indent--;
         base.Writer.WriteLine("}");
         if (element.IsNullable)
         {
             base.Writer.WriteLine("else {");
             IndentedWriter writer3 = base.Writer;
             writer3.Indent++;
             this.WriteLiteralNullTag(element.Name, (element.Form == XmlSchemaForm.Qualified) ? element.Namespace : "");
             IndentedWriter writer4 = base.Writer;
             writer4.Indent--;
             base.Writer.WriteLine("}");
         }
     }
     else if (element.Mapping is ArrayMapping)
     {
         ArrayMapping mapping = (ArrayMapping) element.Mapping;
         if (mapping.IsSoap)
         {
             base.Writer.Write("WritePotentiallyReferencingElement(");
             base.WriteQuotedCSharpString(str);
             base.Writer.Write(", ");
             base.WriteQuotedCSharpString(str2);
             base.Writer.Write(", ");
             base.Writer.Write(source);
             if (!writeAccessor)
             {
                 base.Writer.Write(", ");
                 base.Writer.Write(base.RaCodeGen.GetStringForTypeof(mapping.TypeDesc.CSharpName, mapping.TypeDesc.UseReflection));
                 base.Writer.Write(", true, ");
             }
             else
             {
                 base.Writer.Write(", null, false, ");
             }
             this.WriteValue(element.IsNullable);
             base.Writer.WriteLine(");");
         }
         else if (element.IsUnbounded)
         {
             TypeDesc desc = mapping.TypeDesc.CreateArrayTypeDesc();
             string typeName = desc.CSharpName;
             string variableName = "el" + arrayName;
             string s = "c" + variableName;
             base.Writer.WriteLine("{");
             IndentedWriter writer5 = base.Writer;
             writer5.Indent++;
             this.WriteArrayLocalDecl(typeName, variableName, source, mapping.TypeDesc);
             if (element.IsNullable)
             {
                 this.WriteNullCheckBegin(variableName, element);
             }
             else
             {
                 if (mapping.TypeDesc.IsNullable)
                 {
                     base.Writer.Write("if (");
                     base.Writer.Write(variableName);
                     base.Writer.Write(" != null)");
                 }
                 base.Writer.WriteLine("{");
                 IndentedWriter writer6 = base.Writer;
                 writer6.Indent++;
             }
             base.Writer.Write("for (int ");
             base.Writer.Write(s);
             base.Writer.Write(" = 0; ");
             base.Writer.Write(s);
             base.Writer.Write(" < ");
             if (desc.IsArray)
             {
                 base.Writer.Write(variableName);
                 base.Writer.Write(".Length");
             }
             else
             {
                 base.Writer.Write("((");
                 base.Writer.Write(typeof(ICollection).FullName);
                 base.Writer.Write(")");
                 base.Writer.Write(variableName);
                 base.Writer.Write(").Count");
             }
             base.Writer.Write("; ");
             base.Writer.Write(s);
             base.Writer.WriteLine("++) {");
             IndentedWriter writer7 = base.Writer;
             writer7.Indent++;
             element.IsUnbounded = false;
             this.WriteElement(variableName + "[" + s + "]", element, arrayName, writeAccessor);
             element.IsUnbounded = true;
             IndentedWriter writer8 = base.Writer;
             writer8.Indent--;
             base.Writer.WriteLine("}");
             IndentedWriter writer9 = base.Writer;
             writer9.Indent--;
             base.Writer.WriteLine("}");
             IndentedWriter writer10 = base.Writer;
             writer10.Indent--;
             base.Writer.WriteLine("}");
         }
         else
         {
             string str8 = mapping.TypeDesc.CSharpName;
             base.Writer.WriteLine("{");
             IndentedWriter writer11 = base.Writer;
             writer11.Indent++;
             this.WriteArrayLocalDecl(str8, arrayName, source, mapping.TypeDesc);
             if (element.IsNullable)
             {
                 this.WriteNullCheckBegin(arrayName, element);
             }
             else
             {
                 if (mapping.TypeDesc.IsNullable)
                 {
                     base.Writer.Write("if (");
                     base.Writer.Write(arrayName);
                     base.Writer.Write(" != null)");
                 }
                 base.Writer.WriteLine("{");
                 IndentedWriter writer12 = base.Writer;
                 writer12.Indent++;
             }
             this.WriteStartElement(str, str2, false);
             this.WriteArrayItems(mapping.ElementsSortedByDerivation, null, null, mapping.TypeDesc, arrayName, null);
             this.WriteEndElement();
             IndentedWriter writer13 = base.Writer;
             writer13.Indent--;
             base.Writer.WriteLine("}");
             IndentedWriter writer14 = base.Writer;
             writer14.Indent--;
             base.Writer.WriteLine("}");
         }
     }
     else if (element.Mapping is EnumMapping)
     {
         if (element.Mapping.IsSoap)
         {
             string str9 = (string) base.MethodNames[element.Mapping];
             base.Writer.Write("Writer.WriteStartElement(");
             base.WriteQuotedCSharpString(str);
             base.Writer.Write(", ");
             base.WriteQuotedCSharpString(str2);
             base.Writer.WriteLine(");");
             base.Writer.Write(str9);
             base.Writer.Write("(");
             base.Writer.Write(source);
             base.Writer.WriteLine(");");
             this.WriteEndElement();
         }
         else
         {
             this.WritePrimitive("WriteElementString", str, str2, element.Default, source, element.Mapping, false, true, element.IsNullable);
         }
     }
     else if (element.Mapping is PrimitiveMapping)
     {
         PrimitiveMapping mapping2 = (PrimitiveMapping) element.Mapping;
         if (mapping2.TypeDesc == base.QnameTypeDesc)
         {
             this.WriteQualifiedNameElement(str, str2, element.Default, source, element.IsNullable, mapping2.IsSoap, mapping2);
         }
         else
         {
             string str10 = mapping2.IsSoap ? "Encoded" : "Literal";
             string str11 = mapping2.TypeDesc.XmlEncodingNotRequired ? "Raw" : "";
             this.WritePrimitive(element.IsNullable ? ("WriteNullableString" + str10 + str11) : ("WriteElementString" + str11), str, str2, element.Default, source, mapping2, mapping2.IsSoap, true, element.IsNullable);
         }
     }
     else if (element.Mapping is StructMapping)
     {
         StructMapping mapping3 = (StructMapping) element.Mapping;
         if (mapping3.IsSoap)
         {
             base.Writer.Write("WritePotentiallyReferencingElement(");
             base.WriteQuotedCSharpString(str);
             base.Writer.Write(", ");
             base.WriteQuotedCSharpString(str2);
             base.Writer.Write(", ");
             base.Writer.Write(source);
             if (!writeAccessor)
             {
                 base.Writer.Write(", ");
                 base.Writer.Write(base.RaCodeGen.GetStringForTypeof(mapping3.TypeDesc.CSharpName, mapping3.TypeDesc.UseReflection));
                 base.Writer.Write(", true, ");
             }
             else
             {
                 base.Writer.Write(", null, false, ");
             }
             this.WriteValue(element.IsNullable);
         }
         else
         {
             string str12 = base.ReferenceMapping(mapping3);
             base.Writer.Write(str12);
             base.Writer.Write("(");
             base.WriteQuotedCSharpString(str);
             base.Writer.Write(", ");
             if (str2 == null)
             {
                 base.Writer.Write("null");
             }
             else
             {
                 base.WriteQuotedCSharpString(str2);
             }
             base.Writer.Write(", ");
             base.Writer.Write(source);
             if (mapping3.TypeDesc.IsNullable)
             {
                 base.Writer.Write(", ");
                 this.WriteValue(element.IsNullable);
             }
             base.Writer.Write(", false");
         }
         base.Writer.WriteLine(");");
     }
     else
     {
         if (!(element.Mapping is SpecialMapping))
         {
             throw new InvalidOperationException(Res.GetString("XmlInternalError"));
         }
         SpecialMapping mapping4 = (SpecialMapping) element.Mapping;
         bool useReflection = mapping4.TypeDesc.UseReflection;
         string text1 = mapping4.TypeDesc.CSharpName;
         if (element.Mapping is SerializableMapping)
         {
             this.WriteElementCall("WriteSerializable", typeof(IXmlSerializable), source, str, str2, element.IsNullable, !element.Any);
         }
         else
         {
             base.Writer.Write("if ((");
             base.Writer.Write(source);
             base.Writer.Write(") is ");
             base.Writer.Write(typeof(XmlNode).FullName);
             base.Writer.Write(" || ");
             base.Writer.Write(source);
             base.Writer.Write(" == null");
             base.Writer.WriteLine(") {");
             IndentedWriter writer15 = base.Writer;
             writer15.Indent++;
             this.WriteElementCall("WriteElementLiteral", typeof(XmlNode), source, str, str2, element.IsNullable, element.Any);
             IndentedWriter writer16 = base.Writer;
             writer16.Indent--;
             base.Writer.WriteLine("}");
             base.Writer.WriteLine("else {");
             IndentedWriter writer17 = base.Writer;
             writer17.Indent++;
             base.Writer.Write("throw CreateInvalidAnyTypeException(");
             base.Writer.Write(source);
             base.Writer.WriteLine(");");
             IndentedWriter writer18 = base.Writer;
             writer18.Indent--;
             base.Writer.WriteLine("}");
         }
     }
 }