void ProcessMemberToBin(StringBuilder sb, GenClass oGenClass, GenMember oGenMember, string oVal) { sb.AppendFormat("if(null != {0})\r\n", oVal); sb.AppendFormat("{{\r\n"); sb.AppendFormat("this.bs.WriteItem({0}, function(){{\r\n", Utils.GetSerEnumElemName(oGenClass.sName, oGenMember.sName)); if (oGenMember.bToDo || !CanProcessToDoString(oGenMember)) { sb.AppendFormat("//todo\r\n"); } if (!ProcessToBinToDo(sb, oGenMember, oVal)) { if (null != oGenMember.sType) { GenClass oTemp; if (m_mapProcessedClasses.TryGetValue(oGenMember.sType, out oTemp)) { if (oTemp.bIsEnum) { ProcessJsTypeToBin(sb, oVal, typeof(byte)); } else { sb.AppendFormat("oThis.Write{0}({1});\r\n", oGenMember.sType, oVal); } } } else if (null != oGenMember.oSystemType) { ProcessJsTypeToBin(sb, oVal, oGenMember.oSystemType); } } sb.AppendFormat("}});\r\n", Utils.GetSerEnumElemName(oGenClass.sName, oGenMember.sName)); sb.AppendFormat("}}\r\n"); }
List <GenClass> PreProcess(CodeNamespace code, XmlSchema schema) { List <GenClass> aGenClasses = new List <GenClass>(); for (int i = 0; i < code.Types.Count; ++i) { GenClass oNewClass = PreProcessClass(aGenClasses, code.Types[i]); if (null != oNewClass) { aGenClasses.Add(oNewClass); } } return(aGenClasses); }
void ProcessArrayTypesToBin(StringBuilder sb, GenClass oGenClass, GenMember oGenMember) { sb.AppendFormat("{0}.prototype.toBin{1} = function(eType, oVal){{\r\n", Utils.gc_sBinaryChartWriter, oGenMember.sArrayTypesEnumName); sb.AppendFormat("var oThis = this;\r\n"); sb.AppendFormat("switch(eType)\r\n{{\r\n"); for (int i = 0; i < oGenMember.aArrayTypes.Count; ++i) { GenMember oTempMember = oGenMember.aArrayTypes[i]; sb.AppendFormat("case {0}:\r\n{{\r\n", Utils.GetEnumElemName(oGenMember.sArrayTypesEnumName, oTempMember.sName)); ProcessMemberToBin(sb, oGenClass, oTempMember, "oVal"); sb.AppendFormat("}}\r\nbreak;\r\n"); } sb.AppendFormat("}}\r\n"); sb.AppendFormat("}}\r\n"); }
public void Process(string sOutputDir, List <GenClass> aGenClasses) { StringBuilder oJsSer = new StringBuilder(); List <GenClass> aEnums = new List <GenClass>(); List <GenClass> aClasses = new List <GenClass>(); for (int i = 0; i < aGenClasses.Count; ++i) { GenClass oGenClass = aGenClasses[i]; if (oGenClass.bIsEnum) { aEnums.Add(oGenClass); } else { aClasses.Add(oGenClass); } m_mapProcessedClasses[oGenClass.sName] = oGenClass; } string sFileJs = "SerializeChart.js"; oJsSer.AppendFormat("\"use strict\";\r\n"); oJsSer.AppendFormat(Utils.gc_sFilePrefix); //enums ProcessEnums(oJsSer, aEnums); //ser enums ProcessSerEnums(oJsSer, aClasses); //ToBin oJsSer.AppendFormat("function {0}(memory){{\r\n", Utils.gc_sBinaryChartWriter); oJsSer.AppendFormat("this.memory = memory;\r\n"); oJsSer.AppendFormat("this.bs = new BinaryCommonWriter(this.memory);\r\n"); oJsSer.AppendFormat("}}\r\n"); for (int i = 0; i < aClasses.Count; ++i) { ProcessToBin(oJsSer, aClasses[i]); } //FromBin oJsSer.AppendFormat("function {0}(stream){{\r\n", Utils.gc_sBinaryChartReader); oJsSer.AppendFormat("this.stream = stream;\r\n"); oJsSer.AppendFormat("this.bcr = new Binary_CommonReader(this.stream);\r\n"); oJsSer.AppendFormat("}}\r\n"); for (int i = 0; i < aClasses.Count; ++i) { ProcessFromBin(oJsSer, aClasses[i]); } File.WriteAllText(Path.Combine(sOutputDir, sFileJs), oJsSer.ToString()); }
public void ProcessEnums(StringBuilder sb, List <GenClass> aGenClasses) { for (int i = 0; i < aGenClasses.Count; ++i) { GenClass oGenClass = aGenClasses[i]; for (int j = 0; j < oGenClass.aMembers.Count; ++j) { GenMember oGenMember = oGenClass.aMembers[j]; if (!oGenMember.bInternal) { sb.AppendFormat("var {0} = {1};\r\n", Utils.GetEnumElemName(oGenClass.sName, oGenMember.sName), j); } } sb.AppendFormat("\r\n"); } }
public void ProcessToBin(StringBuilder sb, GenClass oGenClass) { sb.AppendFormat("{0}.prototype.Write{1} = function(oVal){{\r\n", Utils.gc_sBinaryChartWriter, oGenClass.sName); sb.AppendFormat("var oThis = this;\r\n"); for (int i = 0; i < oGenClass.aMembers.Count; ++i) { GenMember oGenMember = oGenClass.aMembers[i]; if (!oGenMember.bInternal) { if (oGenMember.bIsArray) { sb.AppendFormat("if(null != oVal.{0})\r\n{{\r\n", Utils.GetMemberElemName(oGenMember.sName)); sb.AppendFormat("for(var i = 0, length = oVal.{0}.length; i < length; ++i)\r\n", Utils.GetMemberElemName(oGenMember.sName)); sb.AppendFormat("{{\r\n"); if (null != oGenMember.aArrayTypes) { sb.AppendFormat("var eType = oVal.{0}[i];\r\n", Utils.GetMemberElemName(oGenMember.sArrayTypesElementName)); sb.AppendFormat("this.toBin{0}(eType, oVal.{1}[i]);\r\n", oGenMember.sArrayTypesEnumName, Utils.GetMemberElemName(oGenMember.sName)); } else { sb.AppendFormat("var oCurVal = oVal.{0}[i];\r\n", Utils.GetMemberElemName(oGenMember.sName)); ProcessMemberToBin(sb, oGenClass, oGenMember, "oCurVal"); } sb.AppendFormat("}}\r\n"); sb.AppendFormat("}}\r\n"); } else { sb.AppendFormat("var oCurVal = oVal.{0};\r\n", Utils.GetMemberElemName(oGenMember.sName)); ProcessMemberToBin(sb, oGenClass, oGenMember, "oCurVal"); } } } sb.AppendFormat("}}\r\n"); for (int i = 0; i < oGenClass.aMembers.Count; ++i) { GenMember oGenMember = oGenClass.aMembers[i]; if (!oGenMember.bInternal) { if (null != oGenMember.aArrayTypes) { ProcessArrayTypesToBin(sb, oGenClass, oGenMember); } } } }
public void ProcessFromBin(StringBuilder sb, GenClass oGenClass) { if (oGenClass.bIsRoot) { sb.AppendFormat("{0}.prototype.ExternalRead{1} = function(length, val){{\r\n", Utils.gc_sBinaryChartReader, oGenClass.sName); sb.AppendFormat("var res = c_oSerConstants.ReadOk;\r\n"); sb.AppendFormat("var oThis = this;\r\n"); sb.AppendFormat("res = this.bcr.Read1(length, function(t, l){{\r\n"); sb.AppendFormat("return oThis.Read{0}(t, l, val);\r\n", oGenClass.sName); sb.AppendFormat("}});\r\n"); sb.AppendFormat("return res;\r\n"); sb.AppendFormat("}}\r\n"); } sb.AppendFormat("{0}.prototype.Read{1} = function(type, length, val){{\r\n", Utils.gc_sBinaryChartReader, oGenClass.sName); sb.AppendFormat("var res = c_oSerConstants.ReadOk;\r\n"); sb.AppendFormat("var oThis = this;\r\n"); int nCounter = 0; for (int j = 0; j < oGenClass.aMembers.Count; ++j) { GenMember oGenMember = oGenClass.aMembers[j]; if (!oGenMember.bInternal) { if (null != oGenMember.aArrayTypes) { for (int k = 0; k < oGenMember.aArrayTypes.Count; ++k) { nCounter = ProcessMemberFromBin(sb, "val", oGenClass, oGenMember.aArrayTypes[k], oGenMember, nCounter); } } else { nCounter = ProcessMemberFromBin(sb, "val", oGenClass, oGenMember, null, nCounter); } } } sb.AppendFormat("else\r\nres = c_oSerConstants.ReadUnknown;\r\nreturn res;\r\n}}\r\n", oGenClass.sName); }
public void ProcessSerEnums(StringBuilder sb, List <GenClass> aGenClasses) { for (int i = 0; i < aGenClasses.Count; ++i) { GenClass oGenClass = aGenClasses[i]; int nCounter = 0; for (int j = 0; j < oGenClass.aMembers.Count; ++j) { GenMember oGenMember = oGenClass.aMembers[j]; if (!oGenMember.bInternal) { sb.AppendFormat("var {0} = {1};\r\n", Utils.GetSerEnumElemName(oGenClass.sName, oGenMember.sName), nCounter++); if (null != oGenMember.aArrayTypes) { for (int k = 0; k < oGenMember.aArrayTypes.Count; ++k) { sb.AppendFormat("var {0} = {1};\r\n", Utils.GetSerEnumElemName(oGenClass.sName, oGenMember.aArrayTypes[k].sName), nCounter++); } } } } sb.AppendFormat("\r\n"); } }
GenMember PreProcessProperty(List <GenClass> aGenClasses, CodeMemberProperty codeMemberProperty, GenClass oGenClass, ref int nItemsElementName) { GenMember oGenMember = new GenMember(codeMemberProperty.Name); bool bIgnore = false; InitMemberType(oGenMember, codeMemberProperty.Type.BaseType); if (null != codeMemberProperty.Type.ArrayElementType) { oGenMember.bIsArray = true; } List <GenMember> aWrappedMemebers = null; for (int i = 0; i < codeMemberProperty.CustomAttributes.Count; i++) { CodeAttributeDeclaration attribute = codeMemberProperty.CustomAttributes[i]; if (attribute.Name == "System.Xml.Serialization.XmlAttributeAttribute") { oGenMember.bQualified = false; oGenMember.bIsAttribute = true; ParseArguments(attribute.Arguments, oGenMember); //todo могут быть повторы имен атрибутов и child nodes. } else if (attribute.Name == "System.ComponentModel.DefaultValueAttribute") { if (attribute.Arguments.Count > 0) { CodeExpression oCodeExpression = attribute.Arguments[attribute.Arguments.Count - 1].Value; //todo other if (oCodeExpression is CodePrimitiveExpression) { oGenMember.sDefAttribute = ((oCodeExpression as CodePrimitiveExpression)).Value.ToString(); } else if (oCodeExpression is CodeFieldReferenceExpression) { oGenMember.sDefAttribute = ((oCodeExpression as CodeFieldReferenceExpression)).FieldName; } } } else if (attribute.Name == "System.Xml.Serialization.XmlIgnoreAttribute") { bIgnore = true; } else if (attribute.Name == "System.Xml.Serialization.XmlElementAttribute") { GenMember oTemp = oGenMember; if (null != oGenMember.oSystemType && oGenMember.oSystemType == typeof(object)) { oTemp = new GenMember(null); } ParseArguments(attribute.Arguments, oTemp); if (null != oGenMember.oSystemType && oGenMember.oSystemType == typeof(object)) { if (null != oTemp.sName) { if (false == oGenMember.bIsArray) { bIgnore = true; oGenClass.aMembers.Add(oTemp); } else { bIgnore = false; if (null == oGenMember.aArrayTypes) { oGenMember.aArrayTypes = new List <GenMember>(); } oGenMember.aArrayTypes.Add(oTemp); } } } } else if (attribute.Name == "System.Xml.Serialization.XmlArrayItemAttribute") { GenMember oWrapMemeber = new GenMember(null); ParseArguments(attribute.Arguments, oWrapMemeber); if (null != oWrapMemeber.sName) { if (null == aWrappedMemebers) { aWrappedMemebers = new List <GenMember>(); } aWrappedMemebers.Add(oWrapMemeber); } } else if (attribute.Name == "System.Xml.Serialization.XmlArrayAttribute") { ParseArguments(attribute.Arguments, oGenMember); } //todo не всегда прописан //else if (attribute.Name == "System.Xml.Serialization.XmlChoiceIdentifierAttribute") //{ // if (attribute.Arguments.Count > 0) // { // CodePrimitiveExpression oPrimitiveExpression = attribute.Arguments[0].Value as CodePrimitiveExpression; // oGenMember.sChoiceIdentifier = oPrimitiveExpression.Value.ToString(); // } //} } if (bIgnore) { return(null); } else { if (oGenMember.bIsArray && null != aWrappedMemebers) { //todo не проверен случай //[System.Xml.Serialization.XmlArrayItemAttribute("ahPolar", typeof(CT_PolarAdjustHandle), IsNullable=false)] //[System.Xml.Serialization.XmlArrayItemAttribute("ahXY", typeof(CT_XYAdjustHandle), IsNullable=false)] //public object[] ahLst { //создаем wrap class чтобы не работать с двумерными массивами string sNewName = Utils.GetClassName(oGenMember.sName); GenClass oNewGenClass = new GenClass(sNewName, oGenMember.sNamespace); if (null == oNewGenClass.sNamespace) { oNewGenClass.sNamespace = oGenClass.sNamespace; } //помещаем класс указанный в атрибутах в aMembers for (int i = 0; i < aWrappedMemebers.Count; ++i) { GenMember oWrappedMemeber = aWrappedMemebers[i]; if (null == oWrappedMemeber.sType && null == oWrappedMemeber.oSystemType) { oWrappedMemeber.sType = oGenMember.sType; oWrappedMemeber.oSystemType = oGenMember.oSystemType; } oWrappedMemeber.bIsArray = true; oWrappedMemeber.sNamespace = oNewGenClass.sNamespace; oNewGenClass.aMembers.Add(oWrappedMemeber); } //проверяем нет ли такого типа bool bExist = false; bool bNeedCreate = true; GenClass oPrevGenClass; if (m_mapGeneratedClasses.TryGetValue(sNewName, out oPrevGenClass)) { bExist = true; if (oNewGenClass.sName == oPrevGenClass.sName && oNewGenClass.sNamespace == oPrevGenClass.sNamespace && oNewGenClass.aMembers.Count == oPrevGenClass.aMembers.Count) { bNeedCreate = false; for (int i = 0; i < oNewGenClass.aMembers.Count; ++i) { GenMember oGenMember1 = oNewGenClass.aMembers[i]; GenMember oGenMember2 = oPrevGenClass.aMembers[i]; if (oGenMember1.sName != oGenMember2.sName || oGenMember1.sType != oGenMember2.sType || oGenMember1.oSystemType != oGenMember2.oSystemType) { bNeedCreate = true; } } } } if (bNeedCreate) { if (bExist) { int nCount = 1; GenClass oTemp; while (m_mapGeneratedClasses.TryGetValue(sNewName = Utils.GetClassName(oGenMember.sName + nCount), out oTemp)) { nCount++; } oNewGenClass.sName = sNewName; } aGenClasses.Add(oNewGenClass); m_mapGeneratedClasses[oNewGenClass.sName] = oNewGenClass; } //меняем oGenMember, чтобы он ссылался на oNewGenClass if (codeMemberProperty.Type.ArrayElementType.ArrayRank > 0) { oGenMember.bIsArray = true; } else { oGenMember.bIsArray = false; } oGenMember.oSystemType = null; oGenMember.sType = oNewGenClass.sName; } if (oGenMember.bIsArray && null != oGenMember.aArrayTypes) { //добавляем enum для member и дополнительный массив для типов GenClass oNewEnum = new GenClass(Utils.gc_sItemsChoiceType + m_nItemsChoiceTypeCount++, oGenClass.sNamespace); oNewEnum.bInternal = true; oNewEnum.bIsEnum = true; for (int i = 0; i < oGenMember.aArrayTypes.Count; ++i) { oNewEnum.aMembers.Add(new GenMember(oGenMember.aArrayTypes[i].sName)); } GenMember oNewPairArray = new GenMember(Utils.gc_sItemsElementName + nItemsElementName++); oNewPairArray.bInternal = true; oNewPairArray.bIsArray = true; oNewPairArray.sType = oNewEnum.sName; oGenMember.sArrayTypesElementName = oNewPairArray.sName; oGenMember.sArrayTypesEnumName = oNewEnum.sName; oGenClass.aMembers.Add(oNewPairArray); aGenClasses.Add(oNewEnum); } return(oGenMember); } }
GenClass PreProcessClass(List <GenClass> aGenClasses, CodeTypeDeclaration type) { GenClass oGenClass = null; //получаем xml namespace string sNamespace = null; bool bIncludeInSchema = true; bool bIsRoot = false; for (int i = 0; i < type.CustomAttributes.Count; i++) { CodeAttributeDeclaration attribute = type.CustomAttributes[i]; if (attribute.Name == "System.Xml.Serialization.XmlTypeAttribute") { foreach (CodeAttributeArgument argument in attribute.Arguments) { if (argument.Name == "Namespace") { sNamespace = ((CodePrimitiveExpression)argument.Value).Value.ToString(); } else if (argument.Name == "IncludeInSchema") { bIncludeInSchema = Convert.ToBoolean(((CodePrimitiveExpression)argument.Value).Value); } //todo argument.Name == "TypeName" } } else if (attribute.Name == "System.Xml.Serialization.XmlRootAttribute") { bIsRoot = true; string sName = null;//todo foreach (CodeAttributeArgument argument in attribute.Arguments) { if (argument.Name == "Namespace") { sNamespace = ((CodePrimitiveExpression)argument.Value).Value.ToString(); } else if ("" == argument.Name) { sName = ((CodePrimitiveExpression)argument.Value).Value.ToString(); } } } } if (bIncludeInSchema) { oGenClass = new GenClass(type.Name, sNamespace); oGenClass.bIsRoot = bIsRoot; int nItemsElementName = 0; if (type.IsEnum) { oGenClass.bIsEnum = true; for (int i = 0; i < type.Members.Count; ++i) { CodeTypeMember member = type.Members[i]; GenMember oGenMember = new GenMember(member.Name); for (int j = 0; j < member.CustomAttributes.Count; j++) { CodeAttributeDeclaration attribute = member.CustomAttributes[j]; if (attribute.Name == "System.Xml.Serialization.XmlEnumAttribute") { ParseArguments(attribute.Arguments, oGenMember); } } oGenClass.aMembers.Add(oGenMember); } } else { for (int i = 0; i < type.Members.Count; ++i) { CodeTypeMember member = type.Members[i]; //CodeMemberField пропускаем CodeMemberProperty codeMemberProperty = member as CodeMemberProperty; if (codeMemberProperty != null) { GenMember oNewGenMember = PreProcessProperty(aGenClasses, codeMemberProperty, oGenClass, ref nItemsElementName); if (null != oNewGenMember) { oGenClass.aMembers.Add(oNewGenMember); } } } } } return(oGenClass); }
List <GenClass> FilterClasses(List <GenClass> aInput) { List <GenClass> aRes = new List <GenClass>(); string[] aTargetNamespaces = new string[] { "http://purl.oclc.org/ooxml/drawingml/chart", "http://purl.oclc.org/ooxml/officeDocument/relationships", "http://purl.oclc.org/ooxml/officeDocument/sharedTypes", "http://schemas.openxmlformats.org/markup-compatibility/2006", "http://schemas.microsoft.com/office/drawing/2007/8/2/chart" }; string[] aTodoNamespaces = new string[] { "http://purl.oclc.org/ooxml/officeDocument/relationships" }; string[] aStringNamespaces = new string[] { "http://purl.oclc.org/ooxml/drawingml/chartDrawing", "http://purl.oclc.org/ooxml/drawingml/main" }; Dictionary <string, GenClass> mapAllClasses = new Dictionary <string, GenClass>(); for (int i = 0; i < aInput.Count; ++i) { GenClass oGenClass = aInput[i]; if (0 == aTargetNamespaces.Length || -1 != Array.IndexOf(aTargetNamespaces, oGenClass.sNamespace)) { aRes.Add(oGenClass); } mapAllClasses[oGenClass.sName] = oGenClass; } //специально для chart for (int i = 0; i < aRes.Count; ++i) { GenClass oGenClass = aRes[i]; for (int j = 0; j < oGenClass.aMembers.Count; ++j) { GenMember oGenMember = oGenClass.aMembers[j]; string sNamespace = oGenMember.sNamespace; GenClass oTempClass; if (null == sNamespace && null != oGenMember.sType && mapAllClasses.TryGetValue(oGenMember.sType, out oTempClass)) { sNamespace = oTempClass.sNamespace; } if (null != sNamespace) { if (-1 != Array.IndexOf(aTodoNamespaces, sNamespace)) { oGenMember.bToDo = true; } if (-1 != Array.IndexOf(aStringNamespaces, sNamespace)) { oGenMember.bToDoString = true; oGenMember.sType = null; oGenMember.oSystemType = typeof(string); } } if (null != oGenMember.aArrayTypes) { for (int k = 0; k < oGenMember.aArrayTypes.Count; ++k) { GenMember oGenMemberArrayTypes = oGenMember.aArrayTypes[k]; sNamespace = oGenMemberArrayTypes.sNamespace; if (null == sNamespace && null != oGenMemberArrayTypes.sType && mapAllClasses.TryGetValue(oGenMemberArrayTypes.sType, out oTempClass)) { sNamespace = oTempClass.sNamespace; } if (null != sNamespace) { if (-1 != Array.IndexOf(aTodoNamespaces, sNamespace)) { oGenMemberArrayTypes.bToDo = true; } if (-1 != Array.IndexOf(aStringNamespaces, sNamespace)) { oGenMemberArrayTypes.bToDoString = true; oGenMemberArrayTypes.sType = null; oGenMemberArrayTypes.oSystemType = typeof(string); } } } } } } return(aRes); }
int ProcessMemberFromBin(StringBuilder sb, string sVal, GenClass oGenClass, GenMember oGenMember, GenMember oGenMemberContainer, int nCounter) { if (0 != nCounter) { sb.AppendFormat("else "); } sb.AppendFormat("if({0} === type){{\r\n", Utils.GetSerEnumElemName(oGenClass.sName, oGenMember.sName)); if (oGenMember.bToDo || !CanProcessToDoString(oGenMember)) { sb.AppendFormat("//todo\r\n"); } sb.AppendFormat("var oNewVal;\r\n"); if (!ProcessFromBinToDo(sb, oGenMember, "oNewVal")) { if (null != oGenMember.sType) { GenClass oTempClass; if (m_mapProcessedClasses.TryGetValue(oGenMember.sType, out oTempClass)) { if (oTempClass.bIsEnum) { sb.AppendFormat("oNewVal = {0};\r\n", ProcessJsTypeFromBin(sb, typeof(byte))); } else { sb.AppendFormat("oNewVal = {{}};\r\n"); sb.AppendFormat("res = this.bcr.Read1(length, function(t, l){{\r\n"); sb.AppendFormat("return oThis.Read{0}(t, l, oNewVal);\r\n", oTempClass.sName); sb.AppendFormat("}});\r\n"); } } } else if (null != oGenMember.oSystemType) { sb.AppendFormat("oNewVal = {0};\r\n", ProcessJsTypeFromBin(sb, oGenMember.oSystemType)); } else { sb.AppendFormat("res = c_oSerConstants.ReadUnknown;\r\n"); } } if (null != oGenMemberContainer) { sb.AppendFormat("if(null == {0}.{1})\r\n", sVal, Utils.GetMemberElemName(oGenMemberContainer.sArrayTypesElementName)); sb.AppendFormat("{0}.{1} = [];\r\n", sVal, Utils.GetMemberElemName(oGenMemberContainer.sArrayTypesElementName)); sb.AppendFormat("{0}.{1}.push({2});\r\n", sVal, Utils.GetMemberElemName(oGenMemberContainer.sArrayTypesElementName), Utils.GetEnumElemName(oGenMemberContainer.sArrayTypesEnumName, oGenMember.sName)); sb.AppendFormat("if(null == {0}.{1})\r\n", sVal, Utils.GetMemberElemName(oGenMemberContainer.sName)); sb.AppendFormat("{0}.{1} = [];\r\n", sVal, Utils.GetMemberElemName(oGenMemberContainer.sName)); sb.AppendFormat("{0}.{1}.push(oNewVal);\r\n", sVal, Utils.GetMemberElemName(oGenMemberContainer.sName)); } else { if (oGenMember.bIsArray) { sb.AppendFormat("if(null == {0}.{1})\r\n", sVal, Utils.GetMemberElemName(oGenMember.sName)); sb.AppendFormat("{0}.{1} = [];\r\n", sVal, Utils.GetMemberElemName(oGenMember.sName)); sb.AppendFormat("{0}.{1}.push(oNewVal);\r\n", sVal, Utils.GetMemberElemName(oGenMember.sName)); } else { sb.AppendFormat("{0}.{1} = oNewVal;\r\n", sVal, Utils.GetMemberElemName(oGenMember.sName)); } } sb.AppendFormat("}}\r\n"); nCounter++; return(nCounter); }