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); //可以作为参数 }
/// <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); } }
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); //可以作为参数 }
/// <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); }