23.Lua调用C#的泛型

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

×

喜欢就点赞,疼爱就打赏