UH2S2L16——Lua调用重载函数

本章代码关键字

1
2
typeof(CS.类名):GetMethod(方法名, {参数列表})    --反射获取类的方法信息,通过xlua的方法可以转化为函数
xlua.tofunction() --xlua提供的将通过反射获取的方法信息转化为函数的方法

调用重载函数

先在C#脚本内声明如下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Lesson6
{
public int Calc()
{
return 100;
}

public int Calc(int a, int b)
{
return a + b;
}

public int Calc(int a)
{
return a;
}

public float Calc(float a)
{
return a;
}
}

虽然Lua自己不支持写重载函数,但是Lua支持调用C#中的重载函数

1
2
3
4
local obj = CS.Lesson6()

print(obj:Calc())
print(obj:Calc(15, 1))

image

Lua虽然支持调用C#重载函数,但是因为Lua中的数值类型,只有Number
因此对C#中多精度的重载函数支持不好,傻傻分不清,在使用时,可能出现意想不到的问题
因此,如果要给Lua提供重载函数调用,需要尽可能避免使用整数参数和浮点数参数(或者说避免因为精度不同导致的重载)的重载

例如下面的例子,后面的语句明显传入的是浮点数10.2​,但却输出了0

1
2
print(obj:Calc(10))
print(obj:Calc(10.2))

image

解决精度重载调用导致的问题

对于重载函数含糊的问题,xlua提供了解决方案 反射机制
这种方法只做了解,尽量别用(效率低)
Type​是反射的关键类,得到指定函数的相关信息

通过xlua提供的一个方法 把它转成lua函数来使用,一般我们转一次 然后重复使用
成员方法的第一个参数传调用的对象,静态方法不用传对象

1
2
3
4
5
6
7
8
local methodInfo1 = typeof(CS.Lesson6):GetMethod("Calc", {typeof(CS.System.Int32)})
local methodInfo2 = typeof(CS.Lesson6):GetMethod("Calc", {typeof(CS.System.Single)})

local f1 = xlua.tofunction(methodInfo1)
local f2 = xlua.tofunction(methodInfo2)

print(f1(obj, 10))
print(f2(obj, 10.2))

image