Ejemplo n.º 1
0
        static void ReadConfigData <T> (string filePath = null) where T : CsvMgr
        {
            T obj = Activator.CreateInstance <T> ();

            if (filePath == null)
            {
                filePath = typeof(T).Name;
            }

            string getString = Resources.Load <TextAsset>(filePath).text;

            var csr = new CsvReaderByString(getString);

            var objDic = new Dictionary <string, CsvMgr> ();

            FieldInfo[] fis = new FieldInfo[csr.ColCount];
            for (int colNum = 1; colNum < csr.ColCount + 1; colNum++)
            {
                fis [colNum - 1] = typeof(T).GetField(csr [1, colNum]);
            }

            for (int rowNum = 3; rowNum < csr.RowCount + 1; rowNum++)
            {
                T configObj = Activator.CreateInstance <T> ();
                for (int i = 0; i < fis.Length; i++)
                {
                    string fieldValue = csr [rowNum, i + 1];
                    object setValue   = new object();
                    switch (fis [i].FieldType.ToString())
                    {
                    case "System.Int32":
                        setValue = int.Parse(fieldValue);
                        break;

                    case "System.Int64":
                        setValue = long.Parse(fieldValue);
                        break;

                    case "System.String":
                        setValue = fieldValue;
                        break;

                    default:
                        Debug.Log("error data type");
                        break;
                    }
                    fis [i].SetValue(configObj, setValue);
                    if (fis [i].Name == "key" || fis [i].Name == "id")
                    {
                        //只检测key和id的值,然后添加到objDic 中
                        objDic.Add(setValue.ToString(), configObj);
                    }
                }
            }
            dataDic.Add(filePath, objDic);                //可以作为参数
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 读取数据结构信息
        /// </summary>
        private static void LoadRootConfigData()
        {
            //避免重复初始化
            if (_dataConfigInfos != null)
            {
                return;
            }

            _dataConfigInfos = new Dictionary <string, DataConfigInfo>();
            var getString = ResourceMgr.GetAsset <TextAsset>("DataConfig", OriginBundleKey.File).text;

            var csr = new CsvReaderByString(getString);

            for (var i = 1; i < csr.RowCount + 1; i += 2)
            {
                var config = new DataConfigInfo();
                for (var j = 1; j < csr.ColCount + 1; j++)
                {
                    var name = csr[i + 0, j];
                    var type = csr[i + 1, j];
                    switch (type)
                    {
                    case "className":
                        config.className = name;
                        break;

                    case "parentClassName":
                        if (!string.IsNullOrEmpty(name))
                        {
                            config.parentName = name;
                            _dataConfigInfos[config.parentName]
                            .childrenNames.Add(config.className);
                        }
                        break;

                    case "fileKeys":
                        foreach (var fileKey in name.Split('_'))
                        {
                            config.fileKeys.Add(fileKey.Trim());
                        }
                        break;

                    default:
                        if (string.IsNullOrEmpty(name))
                        {
                            break;
                        }
                        config.fieldInfos.Add(
                            name,
                            new FieldInfo
                        {
                            fieldName = name,
                            fieldType = type
                        });
                        break;
                    }
                }
                if (string.IsNullOrEmpty(config.className))
                {
                    throw new Exception("ClassName is null ???");
                }
                if (config.fileKeys.Count == 0)
                {
                    config.fileKeys.Add(config.className);
                }

                _dataConfigInfos.Add(config.className, config);
            }
        }
Ejemplo n.º 3
0
        static void ReadConfigData(Type type, string filePath = null)
        {
            var fileLoadPath = filePath;

            if (string.IsNullOrEmpty(fileLoadPath) || fileLoadPath == type.Name)
            {
                fileLoadPath = type.Name;
            }

            string getString = ResourceMgr.GetAsset <TextAsset>(fileLoadPath, OriginBundleKey.File).text;

            var csr = new CsvReaderByString(getString);

            var dataRow = new Dictionary <string, CsvMgr> ();

            FieldInfo[] fieldInfos = new FieldInfo[csr.ColCount];
            for (int colNum = 1; colNum < csr.ColCount + 1; colNum++)
            {
                fieldInfos [colNum - 1] = type.GetField(csr [1, colNum]);
            }

            //每行都是一条数据,所以循环行数次
            for (int i = 3; i < csr.RowCount + 1; i++)
            {
                var dataObj = Activator.CreateInstance(type);

                //逐个判断当前行每一列域类型加入字典
                for (int j = 0; j < fieldInfos.Length; j++)
                {
                    string fieldValue = csr [i, j + 1];

                    //试探可能的类型,将数据填充到数据项dataItem中
                    object dataItem = new object();
                    switch (fieldInfos [j].FieldType.ToString())
                    {
                    case "System.Single":
                        dataItem = float.Parse(fieldValue);
                        break;

                    case "System.Int32":
                        dataItem = int.Parse(fieldValue);
                        break;

                    case "System.Int64":
                        dataItem = long.Parse(fieldValue);
                        break;

                    case "System.String":
                        dataItem = fieldValue;
                        break;

                    default:
                        Debug.LogWarning("error data type");
                        break;
                    }

                    fieldInfos [j].SetValue(dataObj, dataItem);

                    //如果是第一列,这一列被视为主键
                    if (j == 0)
                    {
                        dataRow.Add(dataItem.ToString(), (CsvMgr)dataObj);
                    }
                }
            }

            dataDic.Add(fileLoadPath, dataRow);                //可以作为参数
        }
Ejemplo n.º 4
0
        /// <summary>
        /// 加载数据,fileKey不合法的时候默认取type.Name
        /// </summary>
        /// <param name="type"></param>
        /// <param name="filePath"></param>
        private static void LoadConfigData(Type type, string fileName)
        {
            Assert.IsNotNull(type);
            Assert.IsNotNull(_dataConfigInfos);
            Assert.IsFalse(string.IsNullOrEmpty(fileName));

            CsvReaderByString csr = null;

            #region 加载csr并初始化fileKey

            //fileKey不合法的时候默认取type.Name

            var asset = ResourceMgr.GetAsset <TextAsset>(fileName, OriginBundleKey.File);

            if (asset == null)
            {
                throw new Exception($"加载数据文件失败,typeKey:{type.Name},fileName:{fileName}");
            }

            csr = new CsvReaderByString(asset.text);

            #endregion

            System.Reflection.FieldInfo[] fieldInfos = null;

            #region 根据type初始化fieldInfos


            fieldInfos = new System.Reflection.FieldInfo[csr.ColCount];
            for (var colNum = 1; colNum < csr.ColCount + 1; colNum++)
            {
                var info = type.GetField(csr [1, colNum]);

                if (info == null)
                {
                    throw new Exception($"GetField failed:如果使用了多态,请尽量使用具体类型代替\ntype:{type.Name}\nfileKey:{fileName}\nfieldName:{csr[1,colNum]}");
                }

                fieldInfos[colNum - 1] = info;
            }

            #endregion


            var dataRow = new Dictionary <string, CsvMgr> ();

            //每行都是一条数据,所以循环行数次
            for (var i = 2; i < csr.RowCount + 1; i++)
            {
                var dataObj = Activator.CreateInstance(type);

                //逐个判断当前行每一列域类型加入字典
                for (var j = 0; j < fieldInfos.Length; j++)
                {
                    var fieldValue = csr [i, j + 1];

                    //试探可能的类型,将数据填充到数据项dataItem中
                    var dataItem = new object();
                    try
                    {
                        switch (fieldInfos [j].FieldType.ToString())
                        {
                        case "System.Single":
                            dataItem = string.IsNullOrEmpty(fieldValue) ? default(float) : float.Parse(fieldValue);
                            break;

                        case "System.Int32":
                            dataItem = string.IsNullOrEmpty(fieldValue) ? default(int) : int.Parse(fieldValue);
                            break;

                        case "System.Int64":
                            dataItem = string.IsNullOrEmpty(fieldValue) ? default(long) : long.Parse(fieldValue);
                            break;

                        case "System.String":
                            dataItem = string.IsNullOrEmpty(fieldValue) ? default(string) : fieldValue;
                            break;

                        default:
                            throw new Exception($"意料之外的字段类型:{fieldInfos [j].FieldType}\ntype:{type.Name}\nfileKey:{fileName}");
                        }
                    }
                    catch (FormatException e)
                    {
                        throw new Exception($"{e.Message}\ninputString:{fieldValue}\ntype:{type.Name}\nfileKey:{fileName}\npos:[{i},{j}]");
                    }



                    fieldInfos [j].SetValue(dataObj, dataItem);

                    //如果是第一列,这一列被视为主键
                    if (j == 0)
                    {
//						Debug.Log(dataObj);
                        dataRow.Add(dataItem.ToString(), (CsvMgr)dataObj);
                    }
                }

                // Debug.Log($"$insert data {dataObj}");
            }

            if (dataRow.Count == 0)
            {
                Debug.LogWarning($"itemDataRow is empty: TypeName{type.Name}, fileName:{fileName}");
            }

            //debug
            // foreach (var kv in dataRow)
            // {
            //  Debug.Log($"success get data: {kv.Value}");
            // }

            SafeInsertDataDic(
                type.Name,
                dataRow,
                fileName);
        }