当我遇到一点障碍时,我正在尝试将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”))但它合理地抱怨模糊匹配。有什么想法吗?
答案 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#中实现此代理函数,并将其绑定,而不是直接绑定每个重载方法。