17.Lua调用C#的重载函数

17.Lua调用CSharp-重载函数


17.1 知识点

准备工作

启动Lua脚本

LuaManager.Instance.Init();
LuaManager.Instance.DoLuaFile("Lesson17_Lua调用CSharp_重载函数");

定义有重载函数的测试类

public class Lesson17_Test
{
    public int OverloadFunction()
    {
        return 100;
    }

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

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

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

在Lua脚本实例化

local test = CS.Lesson17_Test()

直接调用重载函数

调用重载函数

--虽然Lua不支持重载函数 但是Lua支持调用C#中的重载函数  
print(test:OverloadFunction())--100
print(test:OverloadFunction(100, 100))--200

--虽然Lua支持调用C#重载函数 但是由于Lua中的数值类型只有Number 导致Lua对C#中多精度的重载函数支持可能会出现问题
print(test:OverloadFunction(10))--100
print(test:OverloadFunction(10.2))--0

反射调用重载函数

使用反射调用重载函数

--xlua提供了反射机制 可以用来调用重载函数 解决Lua对C#中多精度的重载函数不准确的问题
--反射调用方法只做了解 非必须的情况下不要使用 可能会对性能有影响

--反射得到C#方法
-- local C#方法 = typeof(CS.类名):GetMethod("方法", {typeof(CS.参数类型)})
local CSharpOverloadMethod1 = typeof(CS.Lesson17_Test):GetMethod("OverloadFunction", {typeof(CS.System.Int32)})
local CSharpOverloadMethod2 = typeof(CS.Lesson17_Test):GetMethod("OverloadFunction", {typeof(CS.System.Single)})--Single代表float

--xlua的tofunction方法 把反射得到C#方法转成lua函数来使用
local LuaOverloadMethod1 = xlua.tofunction(CSharpOverloadMethod1)
local LuaOverloadMethod2 = xlua.tofunction(CSharpOverloadMethod2)

--如果得到的是成员方法 第一个参数传对象
--如果得到的是静态方法 不用传对象
print(LuaOverloadMethod1(test, 10))--10
print(LuaOverloadMethod2(test, 10.2))--10.199999809265 转换存在精度问题 但是属于正常调用重载函数

17.2 知识点代码

Lesson17_Lua调用CSharp_重载函数.lua

print('我是Lua脚本 Lesson17_Lua调用CSharp_重载函数')

local test = CS.Lesson17_Test()

print("**********知识点一 直接调用重载函数************")

--虽然Lua不支持重载函数 但是Lua支持调用C#中的重载函数  
print(test:OverloadFunction())--100
print(test:OverloadFunction(100, 100))--200

--虽然Lua支持调用C#重载函数 但是由于Lua中的数值类型只有Number 导致Lua对C#中多精度的重载函数支持可能会出现问题
print(test:OverloadFunction(10))--100
print(test:OverloadFunction(10.2))--0


print("**********知识点二 反射调用重载函数************")
--xlua提供了反射机制 可以用来调用重载函数 解决Lua对C#中多精度的重载函数不准确的问题
--反射调用方法只做了解 非必须的情况下不要使用 可能会对性能有影响

--反射得到C#方法
-- local C#方法 = typeof(CS.类名):GetMethod("方法", {typeof(CS.参数类型)})
local CSharpOverloadMethod1 = typeof(CS.Lesson17_Test):GetMethod("OverloadFunction", {typeof(CS.System.Int32)})
local CSharpOverloadMethod2 = typeof(CS.Lesson17_Test):GetMethod("OverloadFunction", {typeof(CS.System.Single)})--Single代表float

--xlua的tofunction方法 把反射得到C#方法转成lua函数来使用
local LuaOverloadMethod1 = xlua.tofunction(CSharpOverloadMethod1)
local LuaOverloadMethod2 = xlua.tofunction(CSharpOverloadMethod2)

--如果得到的是成员方法 第一个参数传对象
--如果得到的是静态方法 不用传对象
print(LuaOverloadMethod1(test, 10))--10
print(LuaOverloadMethod2(test, 10.2))--10.199999809265 转换存在精度问题 但是属于正常调用重载函数

Lesson17_Lua调用CSharp_重载函数

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Lesson17_Lua调用CSharp_重载函数 : MonoBehaviour
{
    void Start()
    {
        LuaManager.Instance.Init();
        LuaManager.Instance.DoLuaFile("Lesson17_Lua调用CSharp_重载函数");
    }
}

public class Lesson17_Test
{
    public int OverloadFunction()
    {
        return 100;
    }

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

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

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

}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏