private void HandleItem(ProtoToCSItem inItem) { if (!inItem.IsArray) { if (!inItem.IsSelfDefine) // 非数组非自定义类型 eg. int, uint, byte etc. { toStream.Method.Statements.Add(Line("stream." + inItem.Name, "data." + Stringer.GetTobytesMethodName(inItem.MType.ToString()))); // to stream if (inItem.MType == typeof(System.String)) { CodeExpression ieb = new CodeMethodInvokeExpression(new CodeTypeReferenceExpression("bytes"), "Write", new CodeVariableReferenceExpression("this." + inItem.Name + ".Length")); toBytes.Method.Statements.Add(new CodeExpressionStatement(ieb)); } CodeExpression ce = new CodeMethodInvokeExpression(new CodeTypeReferenceExpression("bytes"), "Write", new CodeVariableReferenceExpression("this." + inItem.Name)); // to bytes toBytes.Method.Statements.Add(new CodeExpressionStatement(ce)); } else // 非数组自定义类型 eg. vector3unit { FieldInfo[] fi = inItem.MType.GetFields(); for (int i = 0; i < fi.Length; i++) { toStream.Method.Statements.Add(Line("stream." + inItem.Name + "." + fi[i].Name, "data." + Stringer.GetTobytesMethodName(fi[i].FieldType.ToString()))); // to stream CodeExpression ies = new CodeMethodInvokeExpression(new CodeTypeReferenceExpression("bytes"), "Write", new CodeVariableReferenceExpression("this." + inItem.Name + "." + fi[i].Name)); toBytes.Method.Statements.Add(ies); // to bytes } } } else // 数组 { toStream.Method.Statements.Add(Line("stream." + inItem.Name, "new " + inItem.MType.ToString().Replace("[]", "[" + inItem.ArrayLengthName + "]"))); CodeIterationStatement curBytesFor = AddFor(typeof(int), "i", 0, inItem.Name + "." + inItem.ArrayLengthName); CodeIterationStatement curStreamFor = AddFor(typeof(int), "i", 0, "stream." + inItem.ArrayLengthName); if (inItem.IsSelfDefine) // 自定义数组数据类型 eg. vector3unit[] { curStreamFor.Statements.Add(Line("stream." + inItem.Name + "[i]", "new " + inItem.Name + "()")); // to stream FieldInfo[] fi = Type.GetType(inItem.MType.ToString().Replace("[]", "")).GetFields(); for (int i = 0; i < fi.Length; i++) { string streamLeft = "stream." + inItem.Name + "[i]." + fi[i].Name; string streamRight = "data." + Stringer.GetTobytesMethodName(fi[i].FieldType.ToString()); curStreamFor.Statements.Add(Line(streamLeft, streamRight)); CodeExpression es = new CodeMethodInvokeExpression(new CodeTypeReferenceExpression("bytes"), "Write", new CodeVariableReferenceExpression("this." + inItem.Name + "[i]." + fi[i].Name)); curBytesFor.Statements.Add(new CodeExpressionStatement(es)); // to bytes } } else // 非自定义数组数据类型 eg. int[] { string sleft = "stream." + inItem.Name + "[i]"; string sright = "data." + Stringer.GetTobytesMethodName(inItem.MType.ToString().Replace("[]", "")); curStreamFor.Statements.Add(Line(sleft, sright)); // to stream CodeExpression es = new CodeMethodInvokeExpression(new CodeTypeReferenceExpression("bytes"), "Write", new CodeVariableReferenceExpression("this." + inItem.Name + "[i]")); curBytesFor.Statements.Add(new CodeExpressionStatement(es)); // to bytes } toBytes.Method.Statements.Add(curBytesFor); toStream.Method.Statements.Add(curStreamFor); } }