23.Lua调用CSharp-泛型
23.1 知识点
准备工作
启动Lua脚本
LuaManager.Instance.Init();
LuaManager.Instance.DoLuaFile("Lesson23_Lua调用CSharp_泛型");
创建测试类和测试接口,包含一些泛型方法
public class Lesson23_Test
{
public interface ITest
{
}
public class TestFather
{
}
public class TestSon : TestFather, ITest
{
}
public void TestFun1<T>(T a, T b) where T : TestFather
{
Debug.Log($"有泛型参数 有泛型类约束 的 泛型方法 a:{a} b:{b}");
}
public void TestFun2<T>(T a)
{
Debug.Log($"有泛型参数 没有泛型约束 的 泛型方法 a:{a}");
}
public void TestFun3<T>() where T : TestFather
{
Debug.Log("没有泛型参数 有泛型类约束 的 泛型方法");
}
public void TestFun4<T>(T a) where T : ITest
{
Debug.Log($"有泛型参数 有泛型接口约束 的 泛型方法 a:{a}");
}
public void TestFun5<T,K>(T a,K b)
{
Debug.Log($"有多个泛型参数 没有泛型约束 的 泛型方法 a:{a} b:{b}");
}
public void TestFun6<T,K>(T a,K b)where T : TestFather
{
Debug.Log($"有多个泛型参数 有泛型约束 的 泛型方法 a:{a} b:{b}");
}
}
Lua脚本中实例化测试类
local test = CS.Lesson23_Test()
local testSon = CS.Lesson23_Test.TestSon()
local testFather = CS.Lesson23_Test.TestFather()
直接支持的泛型方法
--支持 有泛型参数 有泛型类约束 的 泛型方法
test:TestFun1(testSon, testFather)--有泛型参数 有泛型类约束 的 泛型方法
test:TestFun1(testFather, testSon)--有泛型参数 有泛型类约束 的 泛型方法
--不支持 有泛型参数 没有泛型约束 的 泛型方法
-- test:TestFun2(testSon)--报错
--不支持 没有泛型参数 有泛型类约束 的 泛型方法
--test:TestFun3()--报错
--不支持 有泛型参数 有泛型接口约束 的 泛型方法
-- test:TestFun4(testSon)--报错
使用库泛型方法让不支持的泛型方法变得支持
有泛型参数没有泛型约束的泛型方法
--使用 xlua.get_generic_method(泛型方法所在的类, "泛型方法名") 得到通用函数
local testFun2 = xlua.get_generic_method(CS.Lesson23_Test, "TestFun2")
--对得到的 通用函数 传入类型作为泛型 得到泛型函数
local testFun2_Int = testFun2(CS.System.Int32)
--调用泛型函数
--成员泛型方法 第一个参数要传调用函数的对象
--如果是静态泛型方法 直接调用
testFun2_Int(test, 1)--有泛型参数 没有泛型约束 的 泛型方法 a:1
有多个泛型参数没有泛型约束的泛型方法
local testFun5 = xlua.get_generic_method(CS.Lesson23_Test, "TestFun5")
local testFun5_Int_Int = testFun5(CS.System.Int32,CS.System.Int32)
testFun5_Int_Int(test, 1, 2)-- 有多个泛型参数 没有泛型约束 的 泛型方法 a:1 b:2
有多个泛型参数有泛型约束的泛型方法
local testFun6 = xlua.get_generic_method(CS.Lesson23_Test, "TestFun6")
local testFun6_TestSon_TestFather = testFun6(CS.Lesson23_Test.TestSon,CS.Lesson23_Test.TestFather)
-- 注意约束是一定要是TestFather类的子类或本身 传错了会报错
testFun6_TestSon_TestFather(test, testSon, testFather)-- 有多个泛型参数 有泛型约束 的 泛型方法 a:Lesson23_Test+TestSon b:Lesson23_Test+TestFather
使用库泛型方法对打包方式有一定的使用限制
- Mono打包 支持使用库泛型方法
- il2cpp打包 如果泛型参数是引用类型支持使用库泛型方法
- il2cpp打包 如果泛型参数是值类型 除非C#那边已经调用过同类型的泛型参数 才支持使用库泛型方法
23.2 知识点代码
Lesson23_Lua调用CSharp_泛型.lua
print('我是Lua脚本 Lesson23_Lua调用CSharp_泛型')
local test = CS.Lesson23_Test()
local testSon = CS.Lesson23_Test.TestSon()
local testFather = CS.Lesson23_Test.TestFather()
print("**********知识点一 直接支持的泛型方法************")
--支持 有泛型参数 有泛型类约束 的 泛型方法
test:TestFun1(testSon, testFather)--有泛型参数 有泛型类约束 的 泛型方法 a:Lesson23_Test+TestSon b:Lesson23_Test+TestFather
test:TestFun1(testFather, testSon)--有泛型参数 有泛型类约束 的 泛型方法 a:Lesson23_Test+TestFather b:Lesson23_Test+TestSon
--不支持 有泛型参数 没有泛型约束 的 泛型方法
-- test:TestFun2(testSon)--报错
--不支持 没有泛型参数 有泛型类约束 的 泛型方法
--test:TestFun3()--报错
--不支持 有泛型参数 有泛型接口约束 的 泛型方法
-- test:TestFun4(testSon)--报错
print("**********知识点二 使用库泛型方法让不支持的泛型方法变得支持************")
-- 有泛型参数没有泛型约束的泛型方法
--使用 xlua.get_generic_method(泛型方法所在的类, "泛型方法名") 得到通用函数
local testFun2 = xlua.get_generic_method(CS.Lesson23_Test, "TestFun2")
--对得到的 通用函数 传入类型作为泛型 得到泛型函数
local testFun2_Int = testFun2(CS.System.Int32)
--调用泛型函数
--成员泛型方法 第一个参数要传调用函数的对象
--如果是静态泛型方法 直接调用
testFun2_Int(test, 1)--有泛型参数 没有泛型约束 的 泛型方法 a:1
-- 有多个泛型参数没有泛型约束的泛型方法
local testFun5 = xlua.get_generic_method(CS.Lesson23_Test, "TestFun5")
local testFun5_Int_Int = testFun5(CS.System.Int32,CS.System.Int32)
testFun5_Int_Int(test, 1, 2)-- 有多个泛型参数 没有泛型约束 的 泛型方法 a:1 b:2
-- 有多个泛型参数有泛型约束的泛型方法
local testFun6 = xlua.get_generic_method(CS.Lesson23_Test, "TestFun6")
local testFun6_TestSon_TestFather = testFun6(CS.Lesson23_Test.TestSon,CS.Lesson23_Test.TestFather)
-- 注意约束是一定要是TestFather类的子类或本身 传错了会报错
testFun6_TestSon_TestFather(test, testSon, testFather)-- 有多个泛型参数 有泛型约束 的 泛型方法 a:Lesson23_Test+TestSon b:Lesson23_Test+TestFather
-- 注意:
--使用库泛型方法对打包方式有一定的使用限制
--Mono打包 支持使用库泛型方法
--il2cpp打包 如果泛型参数是引用类型支持使用库泛型方法
--il2cpp打包 如果泛型参数是值类型 除非C#那边已经调用过同类型的泛型参数 才支持使用库泛型方法
Lesson23_Lua调用CSharp_泛型
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Lesson23_Lua调用CSharp_泛型 : MonoBehaviour
{
void Start()
{
LuaManager.Instance.Init();
LuaManager.Instance.DoLuaFile("Lesson23_Lua调用CSharp_泛型");
}
}
public class Lesson23_Test
{
public interface ITest
{
}
public class TestFather
{
}
public class TestSon : TestFather, ITest
{
}
public void TestFun1<T>(T a, T b) where T : TestFather
{
Debug.Log($"有泛型参数 有泛型类约束 的 泛型方法 a:{a} b:{b}");
}
public void TestFun2<T>(T a)
{
Debug.Log($"有泛型参数 没有泛型约束 的 泛型方法 a:{a}");
}
public void TestFun3<T>() where T : TestFather
{
Debug.Log("没有泛型参数 有泛型类约束 的 泛型方法");
}
public void TestFun4<T>(T a) where T : ITest
{
Debug.Log($"有泛型参数 有泛型接口约束 的 泛型方法 a:{a}");
}
public void TestFun5<T,K>(T a,K b)
{
Debug.Log($"有多个泛型参数 没有泛型约束 的 泛型方法 a:{a} b:{b}");
}
public void TestFun6<T,K>(T a,K b)where T : TestFather
{
Debug.Log($"有多个泛型参数 有泛型约束 的 泛型方法 a:{a} b:{b}");
}
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com