[Unity3D·CSV篇]02.CSV高手级读取
来源:互联网 发布:网络灰色项目 编辑:程序博客网 时间:2024/06/07 02:45
在上一篇中,保存CSV文件每一行的数据为CSVDemo对象时,总是要用if条件判断当前是哪个字段,然后再给对象赋值。
这样太烦人了,要是在开发的过程中不断地有新的想法,不断地新增修改字段,那真是改死人了。
甚至完全失去了改动的兴趣,于是游戏的创意就大打折扣,后果十分严重,嗯嗯。(旁白:说了这么多,接下来就要宣传你的“产品”了吧?)
不过,大家不用怕,有木头在,木头有个好招,大家看招吧。
1. 临时的字典结构
为了以后更方便,我们在搭建代码的时候,通常都会麻烦一点,但是,一劳永逸的事情,我是不会抗拒的。
为了实现我们的目的,我们需要先用一个字典结构把CSV文件保存起来,如下代码:
实际上大部分代码和上一篇是相同的,主要的改动解释如下:
a. 暂时抛弃了CSVDemo类,把CSV文件以【Dictionary<string, Dictionary<string, string>>】的形式保存起来
b. 相当于是,以每一行的ID作为key值,value值保存的是每一行的所有数据
c. 每一行的所有数据又由一个Dictionary<string, string>保存,key值是字段名,value值是每一列的数据值
d. 最终,每一行都以这样的形式保存起来
这样保存起来的结构并不是很方便,因为类型都是字符串,不好取值,没关系,这个只是过度的。
2. 强大的反射
你是否曾经有这样的感觉,那些看起来明明一样的代码,仅仅只是类型不一样;那些看起来明明是一样的代码,仅仅只是调用的属性不一样。
总之,那些看起来明明不应该那么重复的代码,它却总是重复了。
大多数开发者都会有这样的感觉,于是,逆天的反射和泛型出现在我们的面前。
没错,木头要用的就是反射+泛型这个强力的组合。
看看优化后的代码:
主要修改如下:
a. 利用之前写的LoadCsvFile函数获取到字典结构的CSV文件内容
b. 遍历字典结构,取出每一行的内容
c. 利用反射获取CSVDemo类的所有属性
d. 便利CSVDemo类的所有属性,通过每一个属性名字到字典里获取数据内容,然后给CSVDemo对象相应的属性赋值
e. pi.SetValue就是用来给CSVDemo对象的某个属性赋值的,Convert.ChangeType是为了把字符串内容转换为属性对应的类型
最后来测试一下:
尝试获取ID为1的那一行数据,输出日志如下:
结果是完全一样的,但是我们不需要再一个个if条件去判断然后赋值了,反射帮我们做了这件事情。(旁白:那泛型呢?)
3. 泛型呢?
大家一定还有疑问,每个CSV文件都要写这样一段代码来读取吗?
不,这种重复的事情木头是绝对不会做的,我一做重复的事情就会头晕,于是,泛型救了我。
最终完美的读取并保存CSV文件的函数是这样的:
基本上把CSVDemo类型改为T_CsvData泛型即可,调用方式如下:
输出的日志如下:
怎么样?以后读取CSV文件,只需调用【LoadCsvData<CSVDemo>(filePath);】即可。
4. 缓存?
大家肯定还有疑问,每次要用到CSV文件的数据时,都加载一遍,太没效率了吧?
你说得对,这样太没效率了,所以下一篇,木头要开始聊聊如何用最帅的方式缓存CSV文件对象了。
阅读全文
0 0
- [Unity3D·CSV篇]02.CSV高手级读取
- [Unity3D·CSV篇]01.CSV新手级读取
- [Unity3D·CSV篇]00.CSV是什么?
- unity3d读取csv文件
- Unity3d读取.csv文件
- unity3d读取csv文件
- [Unity3D·CSV篇]目录
- Unity3D 异步读取CSV文件
- [Unity3D·CSV篇]03.CSV初级缓存
- [Unity3D·CSV篇]04.CSV高级缓存
- 读取CSV
- 读取CSV
- 读取csv
- unity3d学习笔记(十七)--unity3d读取csv文件
- unity3d学习笔记(十七)--unity3d读取csv文件
- csv 读取 邮件附件读取
- 【Unity3D】 读写 CSV 数据表
- CSV
- 【C/C++开发】多线程编程中的join函数
- 安卓的IntentService的用法
- 轻松搞定Java中异常的使用
- [bzoj]1040: [ZJOI2008]骑士
- Tomcat环境的配置与部署Web应用
- [Unity3D·CSV篇]02.CSV高手级读取
- 函数:isdigit()、atoi()、c_str()
- Java变量深入
- 水波纹效果
- (三)tensorflow学习之旅——mnist的softmax分类示例
- 关于dubbo的provider和consumer都配置timeout超时时间的情况
- [Unity3D·CSV篇]03.CSV初级缓存
- 计算两个字符串的距离(递归搜索会爆栈)
- 关于C#中get和set