Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
            }
        }