Skip to content

For C# dynamically generate deep compare and clone method runtime for any type. (This project is no longer maintained, and you can refer to pure-c-sharp version instead.)

Notifications You must be signed in to change notification settings

523810185/TypeCmpAndCloneGenerator

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

30 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

版本更新日志

2021.8.6 最初的版本。目前存在的问题:

  1. 有field为class的时候,没有判空。(当然,作为Unity序列化数据的使用是没有问题的)
  2. 当存在一个field,继承自List的时候,不会被认为是数组类型的,后面应当使用类似于Odin中TypeExtension中判断一个类型是否继承自List的做法来实现数组类型的相关操作。
  3. 有些ILEmit中代码太长了,应当抽取常用部分,构建面向对象的IL编程。
  4. 关于Clone方法,后面需要想办法使得第一个参数带ref,使得更方便的使用,否则,参数中带有null的一些情况可能不能令人满意。但是测试一下发现lambda中参数似乎不能用ref修饰。后面可能需要考虑类似于在Clone方法的参数中带一个上带一个父类上下文,来避免这个问题。(2021.8.14已解决)

2021.8.8 更新如下:

  1. 检查了field为class的情况下,有null存在的情况。
  2. 对il提供了一些便利的扩展(例如if-then-else块等等),后续需要扩展更多常用的语句,并重构以前的代码结构。
  3. 新问题:在处理class为null的情况突然发现,解析数组类型的时候,只考虑了作为field存在的时候,没有考虑来源也为数组的时候,例如List<List>。(总结一下,只要当前域可能为null,就要处理三种情况的来源,作为顶层参数,作为常规field,作为数组的item)
  4. 新问题:发现没有处理field为高维数组的情况。

2021.8.14 更新如下:

  1. 修复了List中T一些类型在new的时候考虑漏的情况。
  2. 引入了一个据说是来自于Orleans框架深拷贝的DeepCopy源码(https://github.com/ReubenBond/DeepCopy ),想到了第一个参数不能带ref的解决方案,利用 a = clone(b); 来保证值能被正确带出,但是一直new可能性能会欠佳,因此考虑 a = clone(a, b); 的形式,将a传入,避免a本身不为null的情况也被new一次,来提升效率。 大致测试了一下性能以后发现这种优化速度可以提升10倍左右,非常nice!
  3. 新问题:发现没有处理Dictionary相关的深拷贝。

2021.8.20 更新如下:

  1. 修复了深拷贝时struct的class处理不正确的情况,加载域应当使用ldflda而不是ldfld。

2021.8.23 更新如下:

  1. 需要注意的是当struct作为class的域被直接用等号赋值的时候,使用ldfld;当对struct的域进行赋值时,加载struct必须使用ldflda。

About

For C# dynamically generate deep compare and clone method runtime for any type. (This project is no longer maintained, and you can refer to pure-c-sharp version instead.)

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages