private List <ProtoCSItem> GetItems(Dictionary <string, string> inDic) { //string lastValueName = "";// 上一属性的属性名 List <ProtoCSItem> backList = new List <ProtoCSItem>(); foreach (KeyValuePair <string, string> item in inDic) { bool isSelfDefine = false; // 是否为自定义类型 bool isArray = item.Value.Contains("[]"); // 是否为数组 Type t = GetType(item.Value, ref isSelfDefine); // 属性类型 ProtoCSItem i = new ProtoCSItem(item.Key, t); i.IsSelfDefine = isSelfDefine; i.IsArray = isArray; //i.ArrayLengthName = isArray ? lastValueName : ""; backList.Add(i); //backList.Add(new ProtoCSItem(item.Key, GetType(item.Value))); //lastValueName = item.Key; } return(backList); }
private void HanldItems(ProtoCSItem inItem) { string name = inItem.Name; string proName = "m_" + name; Console.WriteLine(name); if (!inItem.IsArray) { if (!inItem.IsSelfDefine) // 非数组的非自定义类型 eg. int, uint, btye etc. { onAnalyze.Method.Statements.Add(Line("this." + proName, "bytes." + GetToStraamMathodName(inItem.MType))); // to stream //if (inItem.MType == typeof(System.String)) //{ // CodeExpression ieb = new CodeMethodInvokeExpression( // new CodeTypeReferenceExpression("bytes"), // "Write", new CodeVariableReferenceExpression("this." + proName + ".Length")); // toBytes.Method.Statements.Add(new CodeExpressionStatement(ieb)); //} 底层已写长度 CodeExpression invokeExpression = new CodeMethodInvokeExpression( new CodeTypeReferenceExpression("bytes"), "Write", new CodeVariableReferenceExpression("this." + proName + "")); toBytes.Method.Statements.Add(new CodeExpressionStatement(invokeExpression)); // to bytes } else // 非数组的自定义类型 eg. vector3unit, vector4unit etc. { onAnalyze.Method.Statements.Add(Line("this." + proName, "new " + inItem.MType.Name + "()"));// onAnalyze FieldInfo[] fi = inItem.MType.GetFields(); for (int i = 0; i < fi.Length; i++) { onAnalyze.Method.Statements.Add(Line("this." + proName + "." + fi[i].Name, "bytes." + GetReflectionString(fi[i].FieldType.ToString())));// to stream CodeExpression ies = new CodeMethodInvokeExpression( new CodeTypeReferenceExpression("bytes"), "Write", new CodeVariableReferenceExpression("this." + proName + "." + fi[i].Name + "")); toBytes.Method.Statements.Add(new CodeExpressionStatement(ies)); // onAnalyze } } } else // --------------------- 数组 -------------------------------- { //onAnalyze.Method.Statements.Add(Line("this." + proName, "new " + inItem.MType.Name.Replace("[]", "[" + inItem.ArrayLengthName + "]"))); //CodeIterationStatement curBytesFor = AddFor(typeof(int), "i", 0, inItem.Name + "." + inItem.ArrayLengthName); //CodeIterationStatement curStreamFor = AddFor(typeof(int), "i", 0, "this." + inItem.ArrayLengthName); string strToBytes = ""; string strOnAnalyze = ""; string itemName = name + "Item"; string typeName = inItem.MType.Name.Replace("[]", ""); string strCnt = "cnt_" + itemName; if (inItem.IsSelfDefine)// 数组自定义数据类型 eg. vector3unit[]、vector4unit[] etc. { Type type = AutoCSharp.Do.Creator.TypeMapper.GetProtoTypeByName(typeName); FieldInfo[] fi = type.GetFields(); strToBytes = "\t\t\tif(this." + proName + " != null) {" + "\r\t\t\t\tbytes.Write(" + proName + ".Length);" + "\r\t\t\t\t" + typeName + " " + itemName + ";" + "\r\t\t\t\tfor(int i = 0; i < " + proName + ".Length; i++) {" + "\r\t\t\t\t\t" + itemName + " = " + proName + "[i];"; for (int i = 0; i < fi.Length; i++) { strToBytes += "\r\t\t\t\t\tbytes.Write(" + itemName + "." + fi[i].Name + ");"; } strToBytes += "\r\t\t\t\t}\r\t\t\t}else {\r\t\t\t\tbytes.Write(0);\r\t\t\t}"; strOnAnalyze = "\t\t\tint " + strCnt + " = bytes.ReadInt();" + "\r\t\t\tif(" + strCnt + " > 0) {\r\t\t\t\t" + "this." + proName + " = new " + typeName + "[" + strCnt + "];" + "\r\t\t\t\t" + typeName + " " + itemName + ";" + "\r\t\t\t\tfor(int i = 0; i < " + strCnt + "; i++) {" + "\r\t\t\t\t\t" + itemName + " = new " + typeName + "();"; for (int i = 0; i < fi.Length; i++) { strOnAnalyze += "\r\t\t\t\t\t" + itemName + "." + fi[i].Name + " = bytes." + GetReflectionString(fi[i].FieldType.ToString()) + ";"; } strOnAnalyze += "\r\t\t\t\t\tthis." + proName + "[i] = " + itemName + ";\r\t\t\t\t}\r\t\t\t}"; } else // 数组非自定义数据类型 eg. int[], byte[] etc. { strToBytes = "\t\t\tif(this." + proName + " != null) {" + "\r\t\t\t\tbytes.Write(" + proName + ".Length);" + "\r\t\t\t\tbytes.Write(" + proName + ");" + "\r\t\t\t} else {\r\t\t\t\tbytes.Write(0);\r\t\t\t}"; strOnAnalyze = "\t\t\tint " + strCnt + " = bytes.ReadInt();" + "\r\t\t\tthis." + proName + " = bytes.ReadBytes(" + strCnt + ");"; } CodeSnippetStatement toBytesSts = new CodeSnippetStatement(strToBytes); CodeSnippetStatement onAnalyzeSts = new CodeSnippetStatement(strOnAnalyze); toBytes.Method.Statements.Add(toBytesSts); onAnalyze.Method.Statements.Add(onAnalyzeSts); } }