UH2S2L20——Lua调用泛型函数

本章代码关键字

1
2
xlua.get_generic_method()        --通过类与方法名获取方法信息,之后传入泛型参数即可构建可用的方法,在调用方法既可所有泛型函数
-- 有一定的局限性

调用泛型函数

  • Lua只有有约束有参数(且约束必须是class​)的泛型函数才能调用
  • 其他情况,需要使用xlua.get_generic_method()​获取方法信息,再传入类型,得到可用的函数,即可调用(IL2CPP打包下存在限制)

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class Lesson12
{
public interface ITest { }

public class TestFather { }

public class TestChild : TestFather, ITest { }

public void TestFun1<T>(T a, T b) where T : TestFather
{
Debug.Log("有参数有约束的泛型方法");
}

public void TestFun2<T>(T a)
{
Debug.Log("有参数 没有约束");
}

public void TestFun3<T>() where T : TestFather
{
Debug.Log("有约束,但是没有参数的泛型函数");
}

public void TestFun4<T>(T a) where T : ITest
{
Debug.Log("有约束有参数,但是约束不是类");
}
}

有参数有约束的泛型方法

虽然Lua不支持传入泛型参数,但是对于有参数有约束的泛型方法支持直接传入参数并执行的

1
2
3
4
5
6
7
8
local obj = CS.Lesson12()

local child = CS.Lesson12.TestChild()
local father = CS.Lesson12.TestFather()

-- 支持有约束有参数的泛型函数
obj:TestFun1(child, father)
obj:TestFun1(father, child)

image

有参数无约束的泛型方法

Lua不支持有参数无约束的泛型方法

1
-- obj:TestFun2(child)

无参数有约束的泛型方法

Lua不支持无参数有约束的泛型方法

1
-- obj:TestFun3()

有参数有约束,但是约束不是类的泛型方法

Lua不支持约束不是class​的泛型方法

1
-- obj:TestFun4(child)

通过特定方法使不可用的泛型方法可用

首先需要得到通用函数,设置泛型的类型再使用

如果反射的是成员方法,则第一个参数需要传入调用函数的对象
如果反射的是静态方法,则第一个参数不需要传入调用函数的对象

1
2
3
4
5
6
-- 得到方法信息
local testFun2 = xlua.get_generic_method(CS.Lesson12, "TestFun2")
-- 设置泛型的类型
local testFun2_R = testFun2(CS.System.Int32)
-- 传入参数调用
testFun2_R(obj, 1)

image

该方法存在局限性,不是在所有的情况下都可以用,有一定的使用限制,
原因可见:CS5L3——Unity跨平台的基本原理之IL2CPP,IL2CPP打包存在的问题

  • Mono打包,这种方式支持使用
  • il2cpp打包,如果泛型参数是引用类型才可以使用
    il2cpp打包,如果泛型参数是值类型,除非C#那边已经调用过了 同类型的泛型参数 lua中才能够被使用