示例#1
0
        public void SetValue(Dictionary <string, string[]> inDic)
        {
            usingList.Add("ProtoBuf");
            usingList.Add("System.Collections.Generic");

            classer.CustomAttributes.Add(new CodeAttributeDeclaration("ProtoContract"));

            List <string> classnames = new List <string>();
            List <string> classexpla = new List <string>();
            List <string> classType  = new List <string>();

            foreach (KeyValuePair <string, string[]> item in inDic)
            {
                classnames.Add(item.Key);
                classexpla.Add(item.Value[0]);
                classType.Add(item.Value[1]);
            }

            string strType;

            for (int i = 0; i < classnames.Count; i++)
            {
                strType = classType[i];
                string    classname = Assist.FirstLetterUp(classnames[i]);
                FieldItem field     = new FieldItem("Dictionary<" + strType + ",Cfg" + classname + ">", classname + "Dic", "new " + "Dictionary<" + strType + ",Cfg" + classname + ">()");
                field.SetAttributes(MemberAttributes.Final | MemberAttributes.Public);
                field.AddAttributes("ProtoMember", i + 1);
                fieldList.Add(field);

                SetComment(classexpla[i], field.Field);
            }
            Create();
        }
示例#2
0
 public Base(string inSpace, string inClassName, string inFolderName)
 {
     spaceName       = inSpace.Trim();
     className       = inClassName;
     folderName      = inFolderName;
     classer         = new CodeTypeDeclaration(Assist.FirstLetterUp(inClassName));
     classer.IsClass = true;
 }
示例#3
0
        /// <summary>
        /// Excel -> 二进制文件
        /// </summary>
        /// <param name="inPath"></param>
        /// <param name="inFolderName"></param>
        /// <param name="suffixName"></param>
        /// <returns></returns>
        public bool Bin(string inPath, string inFolderName, string suffixName)
        {
            Assist.CheckFolderExist(inFolderName);

            //PBData data = new PBData();

            //modify by wukun 2015/10/28
            //PBData需要用到的类都是动态生成的 无需每次添加的时候添加进工程重新编译exe
            //类的cs文件必须放在exe文件根目录的/ExcelfieldStrs/文件夹下
            Type PBDataType = AutoCSharp.Do.Creator.TypeMapper.GetTypeByName("PBData", true);

            object pbData = Activator.CreateInstance(PBDataType);

            //Test Cost Time
            System.Diagnostics.Stopwatch stopWatch = new Stopwatch();
            stopWatch.Start();

            DataSet   ds;
            DataTable dt = null;
            string    classname, subCfgName, subField, fieldTypeStr = "", fieldName = "", fieldStr = "", fieldMaxStr = "";
            Type      classType, subClassType, listType;
            object    classObj, subClassObj, listObj, key;

            FieldInfo   fieldInfo;
            IDictionary fieldValue;
            int         column = 0, subProIndex, arrSize;

            PropertyInfo[]  arrPro, subArrPro;
            bool            isBaseType;
            Regex           reg = new Regex(@"\{.+?\}");
            MatchCollection matches;
            Type            generic = typeof(List <>);

            string[]   arrField;
            MethodInfo method;
            long       maxVal;

            Dictionary <string, long> dicMaxValue;

            Assist.GetObjPaths(suffixName, inPath).ForEach(delegate(string path)
            {
                bool bExcel  = true;
                int rowIndex = 4;
                if (suffixName == ".xlsx")
                {
                    ds = Assist.ExcelToData(path);
                    dt = ds.Tables[0];
                }
                else if (suffixName == ".txt")
                {
                    dt       = Assist.TxtToData(path);
                    bExcel   = false;
                    rowIndex = 5;
                }

                classname = Assist.FirstLetterUp(dt.TableName);

                //TODO Get Cfg Max Value
                dicMaxValue = new Dictionary <string, long>();
                for (column = 0; column < dt.Columns.Count; column++)
                {
                    if (dt.Rows[2][column].ToString().Contains("+"))
                    {
                        fieldName   = Assist.FirstLetterLower(dt.Rows[0][column].ToString().Trim());
                        fieldMaxStr = dt.Rows[rowIndex][column].ToString();
                        maxVal      = 0;
                        if (!Regex.IsMatch(fieldMaxStr, @"\d.\d+"))
                        {
                            maxVal = long.Parse(fieldMaxStr);
                        }
                        dicMaxValue.Add(fieldName, maxVal);
                    }
                }


                //TODO 类型的获取应该动态获取
                classType  = AutoCSharp.Do.Creator.TypeMapper.GetTypeByName("Cfg" + classname);
                fieldInfo  = pbData.GetType().GetField(classname + "Dic");
                fieldValue = fieldInfo.GetValue(pbData) as IDictionary;

                int row = 5;
                if (!bExcel)
                {
                    row = 6;
                }
                bool bDeleted = false;
                try
                {
                    if (classType != null)
                    {
                        for (; row < dt.Rows.Count; row++)
                        {
                            classObj = Activator.CreateInstance(classType);

                            column = 0;
                            if (dt.Rows[row][column].ToString() == "")
                            {
                                break;
                            }
                            arrPro = classType.GetProperties();
                            foreach (PropertyInfo pro in arrPro)
                            {
                                fieldName = pro.Name;
                                if (fieldName == "mkey")
                                {
                                    continue;
                                }
                                fieldStr   = dt.Rows[row][column].ToString();
                                isBaseType = ParseExcelField2ObjectPro(pro, classObj, fieldStr, dicMaxValue[fieldName]);
                                if (isBaseType)
                                {
                                    if (fieldName == "deleted")
                                    {
                                        bDeleted = (int)pro.GetValue(classObj) == 1;
                                    }
                                }
                                else
                                {
                                    if (!reg.IsMatch(fieldStr))
                                    {
                                        column++;
                                        continue;
                                        //throw new Exception("自定义结构配置错误");
                                    }
                                    if (pro.PropertyType.Name == "List`1")
                                    {
                                        matches = reg.Matches(fieldStr);

                                        subCfgName   = pro.PropertyType.GenericTypeArguments[0].Name;
                                        subClassType = AutoCSharp.Do.Creator.TypeMapper.GetTypeByName(subCfgName);
                                        listType     = generic.MakeGenericType(new System.Type[] { subClassType });
                                        listObj      = Activator.CreateInstance(listType);
                                        foreach (object match in matches)
                                        {
                                            subField = match.ToString();
                                            subField = subField.Substring(1, subField.Length - 2);

                                            subClassObj = Activator.CreateInstance(subClassType);
                                            subArrPro   = subClassType.GetProperties();
                                            arrField    = subField.Split(',');
                                            arrSize     = arrField.Length;
                                            subProIndex = 0;
                                            foreach (PropertyInfo subPro in subArrPro)
                                            {
                                                fieldName = subPro.Name;
                                                if (fieldName == "mkey")
                                                {
                                                    continue;
                                                }
                                                if (subProIndex < arrSize)
                                                {
                                                    ParseExcelField2ObjectPro(subPro, subClassObj, arrField[subProIndex++]);
                                                }
                                            }
                                            method = listType.GetMethod("Add");
                                            method.Invoke(listObj, new object[] { subClassObj });
                                        }
                                        pro.SetValue(classObj, listObj);
                                    }
                                    else
                                    {
                                        fieldStr     = fieldStr.Substring(1, fieldStr.Length - 2);
                                        subClassType = AutoCSharp.Do.Creator.TypeMapper.GetTypeByName(pro.PropertyType.Name);
                                        subClassObj  = Activator.CreateInstance(subClassType);
                                        subArrPro    = subClassType.GetProperties();
                                        arrField     = fieldStr.Split(',');
                                        subProIndex  = 0;
                                        foreach (PropertyInfo subPro in subArrPro)
                                        {
                                            fieldName = subPro.Name;
                                            if (fieldName == "mkey")
                                            {
                                                continue;
                                            }
                                            ParseExcelField2ObjectPro(subPro, subClassObj, arrField[subProIndex++]);
                                        }
                                        pro.SetValue(classObj, subClassObj);
                                    }
                                }
                                column++;
                            }

                            if (bDeleted == false)
                            {
                                PropertyInfo proInfo = classType.GetProperty("mkey");
                                key = proInfo.GetValue(classObj, null);
                                fieldValue.Add(key, classObj);
                            }
                        }

                        fieldInfo.SetValue(pbData, fieldValue);
                    }
                }
                catch (Exception ex)
                {
                    string errorMsg = classname + "表第" + (row + 1) + "行\n" + fieldName + "字段\n" + fieldTypeStr + "\n" + fieldStr + "\n" + ex.Message;
                    throw new Exception(errorMsg);
                }
            });

            #region //SceneLayout 读取同级目录下的“Excel/SceneLayout/”内的所有 xml 文件,并将其数据写入 PBData

            //Dictionary<string, XmlDocument> doc = Assist.GetXml(Assist.RootPath + "Excel/SceneLayout/");
            //foreach (KeyValuePair<string, XmlDocument> fieldStr in doc)
            //{
            //    SceneLayout sl = new SceneLayout();
            //    XmlNodeList xcc = fieldStr.Value.SelectSingleNode("Config").ChildNodes;
            //    for (int i = 0; i < xcc.Count; i++)
            //    {
            //        SceneLayoutfieldStr sli = new SceneLayoutfieldStr();

            //        IProtoBufable xmlfieldStrValue = new SceneLayoutfieldStr() as IProtoBufable;// value
            //        List<string> xls = new List<string>();
            //        for (int x = 0; x < xcc[i].Attributes.Count; x++)
            //        {
            //            xls.Add(xcc[i].Attributes[x].Value);
            //        }
            //        xmlfieldStrValue.Set(xls);

            //        sl.fieldStr.Add(xmlfieldStrValue as SceneLayoutfieldStr);
            //    }
            //    data.SceneLayoutDic.Add(fieldStr.Key, sl);
            //}

            #endregion

            using (var file = System.IO.File.Create("PBData"))
            {
                try
                {
                    ProtoBuf.Serializer.Serialize(file, pbData);
                    stopWatch.Stop();
                    double msTime = stopWatch.Elapsed.TotalMilliseconds;
                    Console.WriteLine("耗时" + msTime);
                }
                catch (Exception e)
                {
                    MainWindow.Show(e.ToString());
                }
            }

            return(true);
        }
示例#4
0
        /// <summary>
        /// Excel -> .cs
        /// </summary>
        /// <param name="inFolderPath">输出文件夹名</param>
        /// <param name="suffixName">文件后缀名</param>
        /// <param name="inNameSpace">命名空间</param>
        /// <param name="inHeritNames">继承</param>
        /// <returns></returns>
        public bool Excel(string inPath, string inFolderName, string suffixName, string inNameSpace = "", string inHeritNames = "")
        {
            Assist.CheckFolderExist(inFolderName);
            Assist.DeleteFilesInFolder(inFolderName);

            Dictionary <string, string[]> finalclassname = new Dictionary <string, string[]>();

            //Load Cfg XML
            string cfgPath = Assist.RootPath + "Cfg";;
            Dictionary <string, XmlDocument> dicXML = Assist.GetXml(cfgPath);
            string      xmlName;
            XmlNodeList nodeList;
            Dictionary <string, string> dicFunctions = new Dictionary <string, string>();

            foreach (XmlDocument xml in dicXML.Values)
            {
                xmlName = xml.DocumentElement.Name;
                if (xmlName == "Functions")
                {
                    //保证先Load Functions.xml
                    nodeList = xml.GetElementsByTagName("function");
                    foreach (XmlNode node in nodeList)
                    {
                        foreach (XmlAttribute attr in node.Attributes)
                        {
                            if (attr.Name == "name")
                            {
                                dicFunctions[attr.Value] = node.InnerText;
                                break;
                            }
                        }
                    }
                    break;
                }
            }

            Dictionary <string, ExcelToCSharp> dicEc = new Dictionary <string, ExcelToCSharp>();
            string tableName = "";
            string tableDes  = "";

            string          cfgName = "", desName = "", fieldName;
            ExcelToCSharp   e;
            List <string[]> values;

            foreach (XmlDocument xml in dicXML.Values)
            {
                xmlName = xml.DocumentElement.Name;
                if (xmlName == "CfgItems")
                {
                    nodeList = xml.GetElementsByTagName("cfg");
                    foreach (XmlNode node in nodeList)
                    {
                        foreach (XmlAttribute attr in node.Attributes)
                        {
                            if (attr.Name == "name")
                            {
                                cfgName = attr.Value;
                            }
                            else if (attr.Name == "des")
                            {
                                desName = attr.Value;
                            }
                        }
                        //finalclassname.Add(cfgName, desName);
                        e = new ExcelToCSharp(inHeritNames, "Cfg" + Assist.FirstLetterUp(cfgName), inFolderName, dicFunctions);
                        e.SetInherit(inHeritNames);
                        values = new List <string[]>();
                        foreach (XmlNode paramNode in node.ChildNodes)
                        {
                            string[] v = new string[4];
                            foreach (XmlAttribute attr in paramNode.Attributes)
                            {
                                fieldName = attr.Name;
                                if (fieldName == "name")
                                {
                                    v[0] = attr.Value;
                                }
                                else if (fieldName == "type")
                                {
                                    v[1] = attr.Value;
                                }
                                else if (fieldName == "des")
                                {
                                    v[2] = attr.Value;
                                }
                                else if (fieldName == "link")
                                {
                                    v[3] = attr.Value;
                                }
                            }
                            values.Add(v);
                        }
                        e.SetValue(cfgName, values);
                        dicEc.Add(cfgName, e);
                    }
                }
            }

            try
            {
                Assist.GetObjPaths(suffixName, inPath).ForEach(delegate(string path)
                {
                    DataTable dt = null;
                    bool bExcel  = true;
                    if (suffixName == ".xlsx")
                    {
                        DataSet ds = Assist.ExcelToData(path);
                        dt         = ds.Tables[0];
                    }
                    else if (suffixName == ".txt")
                    {
                        tableDes = path;
                        dt       = Assist.TxtToData(path);
                        bExcel   = false;
                    }

                    if (dt != null)
                    {
                        // ===================== 类名注释 ========================

                        string acn  = path.Contains("(") ? path.Split('(')[1] : path.Split('(')[1];
                        string acnn = acn.Contains(")") ? acn.Split(')')[0] : acn.Split(')')[0];
                        tableDes    = acnn;
                        // =======================================================
                        tableName = Assist.FirstLetterUp(dt.TableName);
                        e         = new ExcelToCSharp(inHeritNames, "Cfg" + tableName, inFolderName, dicFunctions);
                        e.SetInherit(inHeritNames);

                        DataRowCollection rows = dt.Rows;
                        values              = new List <string[]>();
                        string note         = null;
                        string strFieldName = null;
                        for (int x = 0; x < dt.Columns.Count; x++)
                        {
                            if (rows[2][x].ToString() != "")
                            {
                                string[] v = new string[4];
                                v[0]       = rows[0][x].ToString().Trim();
                                v[1]       = rows[2][x].ToString().Trim();
                                if (bExcel)
                                {
                                    v[2] = rows[1][x].ToString().Trim();
                                    v[3] = rows[3][x].ToString().Trim();
                                }
                                else
                                {
                                    strFieldName = rows[1][x].ToString().Trim();
                                    note         = rows[3][x].ToString().Trim();
                                    v[2]         = note == "" ? strFieldName : string.Concat(strFieldName, ";", note);
                                    v[3]         = rows[4][x].ToString().Trim();
                                }

                                values.Add(v);
                            }
                        }
                        e.SetValue(acnn, values);
                        dicEc.Add(tableName, e);

                        finalclassname.Add(dt.TableName, new string[] { acnn, e.GetKeyType() });
                    }
                });
            }
            catch (Exception ex)
            {
                throw new Exception(tableDes + ex.Message + "可能是Excel打开表左下角的名字跟其它表重复。");
            }

            foreach (ExcelToCSharp ec in dicEc.Values)
            {
                ec.CreateCode(dicEc);
            }

            CreatePBData final = new CreatePBData(inHeritNames, "PBData", inFolderName);

            final.SetValue(finalclassname);
            return(true);
        }
示例#5
0
        /// <summary>
        /// <para>0: 字段名</para>
        /// <para>1: a+i+0 指明类型及是否为Key值</para>
        /// <para>2: 注释</para>
        /// </summary>
        /// <param name="inList">0: 字段名</param>
        public void SetValue(string tableName, List <string[]> inList)
        {
            classer.CustomAttributes.Add(new CodeAttributeDeclaration("ProtoContract"));

            List <KeyValuePair <string, string> > keyList = new List <KeyValuePair <string, string> >();// key 值

            string[]             ss, arrContruct;
            string               attrName, typeString, linkTable, cfgName, strListType, content, ks = "", bit = "";
            MethodItem           mis;
            CodeSnippetStatement state;
            PropertyItem         item, keyPropertyItem;
            Regex rgx = new Regex(@"[\[\]]{1}");
            bool  isArray;

            for (int i = 0; i < inList.Count; i++)
            {
                arrContruct = inList[i];
                if (!arrContruct[1].Contains("+"))
                {
                    continue;
                }
                ss         = arrContruct[1].Split('+');
                attrName   = Assist.FirstLetterLower(arrContruct[0]);
                typeString = ss[1];
                string strTmp = arrContruct[3].Trim();
                if (strTmp == "")
                {
                    strTmp = "0";
                }
                linkTable = Assist.FirstLetterUp(strTmp);
                cfgName   = "Cfg" + linkTable;
                //link table 不指定id
                if (typeString == "t")
                {
                    mis = new MethodItem("GetList" + cfgName, MemberAttributes.Final | MemberAttributes.Public, new List <string>()
                    {
                    });
                    SetComment("获取List<" + cfgName + ">", mis.Method);
                    strListType           = "List<" + cfgName + ">";
                    mis.Method.ReturnType = new CodeTypeReference(strListType);

                    content             = dicFunctions["GetListCfgNameUnAttach"];
                    content             = content.Replace("{TableName}", linkTable);
                    content             = content.Replace("{CfgName}", cfgName);
                    content             = content.Replace("{Type}", "long");
                    m_linkMethodContent = content;
                    m_linkTableName     = linkTable;
                    m_linkMethod        = mis;
                    //content = content.Replace("{MainKey}", **);

                    //state = new CodeSnippetStatement(content);
                    //mis.Method.Statements.Add(state);
                    //methodList.Add(mis);
                    continue;
                }

                //是否数组eg. [i]
                isArray = false;
                if (rgx.IsMatch(typeString))
                {
                    isArray    = true;
                    typeString = rgx.Replace(typeString, "");
                }

                //link table 指定id
                if (Regex.IsMatch(linkTable, @"[a-zA-Z]+"))
                {
                    //string msg = className.Substring(3) + "的" + attrName + "第四列要把浮点数改成0";
                    //System.Windows.MessageBox.Show(msg);
                    if (isArray)
                    {
                        mis = new MethodItem("GetList" + cfgName, MemberAttributes.Final | MemberAttributes.Public, new List <string>()
                        {
                        });
                        SetComment("获取List<" + cfgName + ">", mis.Method);
                        strListType           = "List<" + cfgName + ">";
                        mis.Method.ReturnType = new CodeTypeReference(strListType);
                        content = dicFunctions["GetListCfgNameInArray"];
                        content = content.Replace("{TableName}", linkTable);
                        content = content.Replace("{CfgName}", cfgName);
                        content = content.Replace("{Param}", attrName);
                        content = content.Replace("{Type}", "int");

                        state = new CodeSnippetStatement(content);
                        mis.Method.Statements.Add(state);
                        methodList.Add(mis);
                    }
                    else
                    {
                        mis = new MethodItem("Get" + cfgName, MemberAttributes.Final | MemberAttributes.Public, new List <string>()
                        {
                        });
                        SetComment("获取" + cfgName, mis.Method);
                        mis.Method.ReturnType = new CodeTypeReference(cfgName);
                        content = dicFunctions["GetCfgName"];
                        content = content.Replace("{TableName}", linkTable);
                        content = content.Replace("{Param}", attrName);

                        state = new CodeSnippetStatement(content);
                        mis.Method.Statements.Add(state);
                        methodList.Add(mis);
                    }
                }

                fieldList.Add(new FieldItem(arrContruct[0], arrContruct[1], MemberAttributes.Private));
                item = new PropertyItem(arrContruct[0]);
                item.SetGetName();
                item.SetSetName();

                item.SetComment(arrContruct[2]);
                item.SetValueType(arrContruct[1]);
                item.SetModifier(MemberAttributes.Public | MemberAttributes.Final);
                item.SetField("ProtoMember", (i + 1).ToString());
                propertyList.Add(item);

                if (ss[2] == "1")// 如果该属性是类的Key值,则加入列表
                {
                    if (m_mainKey == null)
                    {
                        m_mainKey = attrName;
                    }
                    string strType = item.Property.Type.BaseType;
                    if (strType == "System.Int32" || strType == "System.Int64")
                    {
                        string[] arrType = arrContruct[1].Split('+');
                        string   keyBit  = "";
                        if (arrType.Length == 4)
                        {
                            keyBit = arrType[3];
                        }
                        keyList.Add(new KeyValuePair <string, string>(attrName, keyBit));
                    }
                    else
                    {
                        throw new Exception(tableName + "的主键" + attrName + "必须是整数类型!");
                    }
                }
            }

            //Key 属性
            int keyCnt = keyList.Count;

            if (keyCnt > 0)
            {
                keyPropertyItem = new PropertyItem("mkey");
                if (keyCnt > 1)
                {
                    this.m_keyType = "long";
                    List <Type>   paramTypes = new List <Type>();
                    List <string> paramNames = new List <string>();
                    string        strGenKey  = "\t\treturn ";
                    for (int i = 0; i < keyCnt - 1; i++)
                    {
                        attrName = keyList[i].Key;
                        bit      = keyList[i].Value;
                        //不配置的话默认16位累加
                        if (bit == "")
                        {
                            bit = "" + 16 * (keyCnt - 1 - i);
                        }
                        ks += "((long)this.m_" + attrName + " << " + bit + ") + ";
                        paramTypes.Add(typeof(System.Int32));
                        paramNames.Add(attrName);
                        strGenKey += "((long)" + attrName + " << " + bit + ") + ";
                    }

                    attrName = keyList[keyCnt - 1].Key;
                    paramTypes.Add(typeof(System.Int32));
                    paramNames.Add(attrName);
                    strGenKey += attrName + ";";

                    //GenKey方法
                    mis = new MethodItem("GenKey", MemberAttributes.Final | MemberAttributes.Public | MemberAttributes.Static, paramTypes, paramNames);
                    SetComment("GenKey方法", mis.Method);
                    mis.Method.ReturnType = new CodeTypeReference(typeof(System.Int64));
                    state = new CodeSnippetStatement(strGenKey);
                    mis.Method.Statements.Add(state);
                    methodList.Add(mis);
                }
                ks += "this.m_" + keyList[keyCnt - 1].Key;
                ks  = "\t\t\treturn " + ks + ";";
                keyPropertyItem.SetGetName(ks, true);
                if (this.m_keyType == "int")
                {
                    keyPropertyItem.SetValueType(typeof(System.Int32));
                }
                else if (this.m_keyType == "long")
                {
                    keyPropertyItem.SetValueType(typeof(System.Int64));
                }

                keyPropertyItem.SetModifier(MemberAttributes.Public | MemberAttributes.Final);
                keyPropertyItem.SetComment("类的Key值");
                propertyList.Add(keyPropertyItem);
            }
        }