在XLua源码学习(一)中讲的主要是Lua对C#静态类的调用方法,本次将会讲到的是对对象方法的调用。
注意看代码中的注释,精华都在注释中。
类的静态字段方法实现
在XLua中对类的静态字段属性方法调用都是归属于对cls_table的映射操作。在生成适配代码的模式中,XLua将一个类的静态方法名都作为一个key存储在cls_table中,而对应的值是一个委托,这个委托将会调用到C#中对应的字段或者方法上,并且这个委托都是会在XLua的GenWrap代码阶段生成。但是在反射模式中XLua也是将一个类的静态方法名作为一个Key存储在cls_table中,但是其所有的值对应的是同一个委托,这个委托是一个闭包函数,闭包函数中会有一个值,它索引的是本次应该调用C#中的某个方法。
不过XLua对一个类的字段和属性的实现与方法不同,XLua会为字段名和属性名为Key存储在一个cls_getter的Table中,而对应的值是一个委托,这个委托会调用到C#对应的属性和字段,但是要注意的是这个clsgetter Table不会存储在cls_table中,而是作为闭包函数的一个参数保存起来,而且这个闭包函数会被作为cls_table的__index元方法。设置字段和字段也是同理。
这边剖析下代码:
这边还需要着重提到的是gen_cls_indexer方法,这个方法实现的是对子类和父类的属性字段和方法的搜索实现比较重要.
代码如下:
在Lua中我们调用 Object.name时候,就会调用到Object对应的cls_table,然后name字段是不存在的,接着会调用__index方法,上文中的__index方法对应的其实就是cls_indexer。
实现如下:
在反射模式中实现也是一样的,在此就不再赘述,字段属性的set也是与get一致,无非_index元方法变成了__newindex方法而已,也不再赘述。
对象字段方法实现
同类型的对象其对字段属性方法的查找都是使用的同一个元表,元表存储在全局变量中,并且在每次创建对象的时候,根据对象类型,查找对应的元表,然后将对应的lua对象的元表设置为查找到的元表即可,完成操作映射。
代码如下,因为与类的静态属性方法实现类似,就简单注释:
gen_obj_indexer也是跟之前的一样,这个方法实现的是对子类和父类搜索,也是压入一个nil的值,给后续查找父类的索引器的占一个位置。
这边主要来看下objindexer方法,也就是gen_obj_indexr中生成的闭包方法.
代码如下:
这样XLua对对象操作和类操作的映射原理已经全部讲完,下次将分析热更技术实现的原理。