LuaInterface - 如何注册重载方法?

时间:2010-05-18 05:00:24

标签: c# .net scripting lua luainterface

当我遇到一点障碍时,我正在尝试将Lua集成到我的C#应用​​程序中。我希望有更多专业知识的人可以帮助我找到正确的方向。

假设我有以下C#方法:

public void MyMethod(int foo) { ... }
public void MyMethod(int foo, int bar) { ... }

我想将它注册到我的Lua脚本环境中,以便我可以这样做:

-- call method with one param
MyMethod(123)
-- call method with two params
MyMethod(123, 456)

我尝试了RegisterFunction(“MyMethod”,this,this.GetType()。GetMethod(“MyMethod”))但它合理地抱怨模糊匹配。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

由于对GetMethod的调用,实际上引发了模糊方法异常:当GetMethod的参数是一个字符串(方法名称)而没有为参数指定Type[]时,该名称有多个方法,抛出异常。

如果您不必严格绑定问题中的单个方法,则可以按照演示in the LuaInterface test code注册课程:

    private Lua _Lua;

    public void Init()
    {
        _Lua = new Lua();

        GC.Collect();  // runs GC to expose unprotected delegates
    }

    public void TestMethodOverloads()
    {
        Init();

        _Lua.DoString("luanet.load_assembly('mscorlib')");
        _Lua.DoString("luanet.load_assembly('TestLua')");
        _Lua.DoString("TestClass=luanet.import_type('LuaInterface.Tests.TestClass')");
        _Lua.DoString("test=TestClass()");
        _Lua.DoString("test:MethodOverload()");
        _Lua.DoString("test:MethodOverload(test)");
        _Lua.DoString("test:MethodOverload(1,1,1)");
        _Lua.DoString("test:MethodOverload(2,2,i)\r\nprint(i)");
    }

这应该正确调用你的重载。

否则,您必须致电the GetMethod overload that takes a Type[] argument并绑定到单独的Lua函数,或坚持使用@Judge's answer

答案 1 :(得分:0)

您可以使用不同的名称注册函数,然后使用纯Lua函数通过检查参数来调度到正确的方法

function MyMethod(foo, bar)
    if bar then
        MyMethod1(foo, bar)
    else
        MyMethod2(foo)
    end
end

或者,您可以在C#中实现此代理函数,并将其绑定,而不是直接绑定每个重载方法。