目的與好處
- 不依賴于具體存儲(chǔ)格式, 統(tǒng)籌表格格式差異(xml和csv)
- 有報(bào)錯(cuò)機(jī)制: 能夠清楚指出 某表.某行.某列 數(shù)據(jù)有誤, 或格式有誤, 能統(tǒng)一彈出提示窗口, 讓策劃自己玩耍.
- 簡(jiǎn)化代碼, 逐步統(tǒng)一所有配置表處理代碼與風(fēng)格.
- 類型自動(dòng)轉(zhuǎn)換, 支持[所有基本數(shù)據(jù)類型], 以及枚舉, Vector2, Vector3, 數(shù)組(可自定義分隔符, 默認(rèn)'|', 可配置)
遷移代價(jià)
- 需要使用上進(jìn)行適應(yīng), 習(xí)慣新的方式, 對(duì)無法滿足的需求進(jìn)行指出.
- 特殊類型轉(zhuǎn)換代碼依然需要自行從原代碼中copy出來, 只是換了另一種方式.
- 改動(dòng)還是有工作量在, 而且需要細(xì)心遷移, 注意檢測(cè)結(jié)果.
操作細(xì)則:
以DriverLicenseVo, SeasonRankInfo為例: DriverLicenseConfig.xml, rank_match.xml
1.配置類繼承 DBaseInfo 或 DUniqueInfo, 使用特性[TableFile]
// 無唯一ID
[TableFile(Name = "DriverLicenseConfig.xml")]
public class DriverLicenseVo : DBaseInfo
// 有唯一ID, 需要填寫PK(主鍵)字段的名詞, 對(duì)應(yīng)xml中某唯一列
[TableFile(PK = "Rank", Name = "rank_math.xml")]
public class SeasonRankInfo : DUniqueInfo
#特性說明:
- PK: 主鍵名
- Name: 配置文件全名
#基類說明:
- DBaseInfo: 無唯一列的數(shù)據(jù)類繼承
- DUniqueInfo: 有唯一列的數(shù)據(jù)類繼承, 需要填寫PK列名
2.特殊需求
類型處理不能滿足:
#DriverLicenseVo.cs
// 原始數(shù)據(jù)需要拼接一段字符串, 才進(jìn)行枚舉轉(zhuǎn)換"License"
[TableColumn(Name = "driverLevel")]
private string _driverLevel
{
set { driverLevel = (DriverLevelType)Enum.Parse(typeof(DriverLevelType), "License" + value); }
}
// 駕照等級(jí)
public DriverLevelType driverLevel = DriverLevelType.None;
- 說明: 設(shè)置了[TableColumn(Name = "driverLevel")] 中的Name優(yōu)先于字段原名.
所以可以寫一個(gè)private的setter, 進(jìn)行類型轉(zhuǎn)換處理
3.配置類修改說明
- 1.屬性名稱與xml字段同名: xml的AttributeName對(duì)應(yīng)類的FieldName, 會(huì)直接進(jìn)行賦值.
# DriverLicenseVo.cs
// 駕照標(biāo)題
public string title = null;
<item ... title="新手教程" ...></item>
title大小寫完全一致最省事, 什么都不用配置
- 2.如果屬性名字與xml中的不對(duì)應(yīng)
使用特性[TableColumn(Name = "數(shù)據(jù)列名稱")]來指定.
# SeasonRankInfo.cs
// 段位描述
[TableColumn(Name = "Describe")]
public string des = string.Empty;
<item ... Describe="青銅" ...></item>
特別注意xml中存在英文單詞拼寫錯(cuò)誤, 導(dǎo)致與類中字段名不一致的情況
- 3.若需要進(jìn)行"string".Split(',')進(jìn)行處理的數(shù)組類型, 則使用特性[TableColumn(Sp = ",")]來指定.
# DriverLicenseVo.cs
[TableColumn(Sp = ",")]
// 機(jī)器人名稱
public string[] robotNames = null;
// 上面配置相當(dāng)于舊代碼:
vo.robotNames = table["robotNames"].ToString().Split(',');
4.加載代碼添加泛型參數(shù):
- 1.在ConfigLoader.InitLoaderQueue配置加載入口處, 修改代碼如下:
LoadConfig<DriverLicenseVo>(...);
LoadConfig<SeasonRankInfo>(...);
- 2.多表合一需要多傳一個(gè)參數(shù)
LoadConfig<SectionIndexTableVo>(ConfigPath.PVE_CONFIG, "SectionName", LoadMode.NetFirst);
SectionName 就是多表中的子節(jié)點(diǎn)名, 一張表有多少個(gè)子表, 就要寫幾行, 只是類名不同, 子表名稱不同
4.XmlOperation中xml轉(zhuǎn)vo的代碼, 修改為
參考 XmlOperation.LoadXMLDriveringLicenseCofing:
// 獲取整個(gè)表格List
List<DriverLicenseVo> vos = TableReader.GetInfos<DriverLicenseVo>();
參考 XmlOperation.LoadXMlMatchRankInfo:
// 根據(jù)id獲取單條記錄 [繼承DUniqueInfo才能使用此API]
DriverLicenseVo vo = TableReader.GetInfo<DriverLicenseVo>(id);
整理過程如遇到困難, 需要擴(kuò)展功能, 歡迎提出需求。