2021.8.6 最初的版本。目前存在的问题:
- 有field为class的时候,没有判空。(当然,作为Unity序列化数据的使用是没有问题的)
- 当存在一个field,继承自List的时候,不会被认为是数组类型的,后面应当使用类似于Odin中TypeExtension中判断一个类型是否继承自List的做法来实现数组类型的相关操作。
- 有些ILEmit中代码太长了,应当抽取常用部分,构建面向对象的IL编程。
- 关于Clone方法,后面需要想办法使得第一个参数带ref,使得更方便的使用,否则,参数中带有null的一些情况可能不能令人满意。但是测试一下发现lambda中参数似乎不能用ref修饰。后面可能需要考虑类似于在Clone方法的参数中带一个上带一个父类上下文,来避免这个问题。(2021.8.14已解决)
2021.8.8 更新如下:
- 检查了field为class的情况下,有null存在的情况。
- 对il提供了一些便利的扩展(例如if-then-else块等等),后续需要扩展更多常用的语句,并重构以前的代码结构。
- 新问题:在处理class为null的情况突然发现,解析数组类型的时候,只考虑了作为field存在的时候,没有考虑来源也为数组的时候,例如List<List>。(总结一下,只要当前域可能为null,就要处理三种情况的来源,作为顶层参数,作为常规field,作为数组的item)
- 新问题:发现没有处理field为高维数组的情况。
2021.8.14 更新如下:
- 修复了List中T一些类型在new的时候考虑漏的情况。
- 引入了一个据说是来自于Orleans框架深拷贝的DeepCopy源码(https://github.com/ReubenBond/DeepCopy ),想到了第一个参数不能带ref的解决方案,利用 a = clone(b); 来保证值能被正确带出,但是一直new可能性能会欠佳,因此考虑 a = clone(a, b); 的形式,将a传入,避免a本身不为null的情况也被new一次,来提升效率。 大致测试了一下性能以后发现这种优化速度可以提升10倍左右,非常nice!
- 新问题:发现没有处理Dictionary相关的深拷贝。
2021.8.20 更新如下:
- 修复了深拷贝时struct的class处理不正确的情况,加载域应当使用ldflda而不是ldfld。
2021.8.23 更新如下:
- 需要注意的是当struct作为class的域被直接用等号赋值的时候,使用ldfld;当对struct的域进行赋值时,加载struct必须使用ldflda。