예제 #1
0
        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);
            }
        }