/// <summary> /// 真正进行读取 /// </summary> /// <param name="type"></param> /// <param name="contents"></param> private void DoLoadTab(Type type, IEnumerable <string> contents) { CDebug.Assert(typeof(CBaseInfo).IsAssignableFrom(type)); foreach (string content in contents) { using (CTabFile tabFile = CTabFile.LoadFromString(content)) { Dictionary <string, CBaseInfo> dict; if (!SettingInfos.TryGetValue(type, out dict)) // 如果没有才添加 { dict = new Dictionary <string, CBaseInfo>(); } const int rowStart = 1; for (int row = rowStart; row <= tabFile.GetHeight(); row++) { // 先读取ID, 获取是否之前已经读取过配置, // 如果已经读取过,那么获取原配置对象,并重新赋值 (因为游戏中其它地方已经存在它的引用了,直接替换内存泄露) string id = tabFile.GetString(row, "Id"); // 获取ID是否存在, 如果已经存在,那么替换其属性,不new一个 CBaseInfo existOne; if (dict.TryGetValue(id, out existOne)) { if (FoundDuplicatedIdEvent != null) { FoundDuplicatedIdEvent(type, row, id); } CBaseInfo existInfo = existOne; existInfo.ReadFromTab(type, ref existInfo, tabFile, row); // 修改原对象,不new existInfo.CustomReadLine(tabFile, row); (existInfo as CBaseInfo).Parse(); } else { CBaseInfo pInfo = CBaseInfo.NewFromTab(type, tabFile, row); pInfo.CustomReadLine(tabFile, row); pInfo.Parse(); dict[pInfo.Id] = pInfo; // 不存在,直接new } } SettingInfos[type] = dict; } } }
private void DoLoadTab <T>(string tabPath) where T : CBaseInfo { #if GAME_CLIENT //using (CTabReader tabFile = CTabReader.LoadFromString(tabPath, CSettingManager.Instance.LoadSetting(tabPath))) using (CTabFile tabFile = CTabFile.LoadFromString(CSettingManager.Instance.LoadSetting(tabPath))) #else // Editor Only string p1 = System.IO.Path.GetFullPath("Assets/" + CCosmosEngine.GetConfig("ProductRelPath") + "/") + tabPath; using (CTabFile tabFile = CTabFile.LoadFromString(System.IO.File.ReadAllText(p1))) #endif { int rowStart = 1; Dictionary <string, CBaseInfo> dict = new Dictionary <string, CBaseInfo>(); for (int i = rowStart; i < tabFile.GetHeight(); i++) { // 先读取ID, 获取是否之前已经读取过配置, // 如果已经读取过,那么获取原配置对象,并重新赋值 (因为游戏中其它地方已经存在它的引用了,直接替换内存泄露) string id = tabFile.GetString(i, "Id"); // 获取ID是否存在, 如果已经存在,那么替换其属性,不new一个 CBaseInfo existOne; if (dict.TryGetValue(id, out existOne)) { CBaseInfo existT = existOne; CBaseInfo.LoadFromTab(typeof(T), ref existT, tabFile, i); // 修改原对象,不new (existT as CBaseInfo).Parse(); } else { T pInfo = CBaseInfo.LoadFromTab(typeof(T), tabFile, i) as T; pInfo.Parse(); dict[pInfo.Id] = pInfo; // 不存在,直接new } } SettingInfos[typeof(T)] = dict; } }