我正在考虑将一些C#/ Lua接口代码从一个Lua库移动到另一个Lua库。所以我需要重写50个或更多的方法绑定才能使用新的库绑定接口。新的更笨拙和笨重,这是一个如何绑定一个名为createTable()的c#方法的例子。
// Delegates
private delegate LuaTable dlgCreateTable();
public LuaTable createTable()
{
LuaTable table = luaRuntime.CreateTable();
return table;
}
then I do ........
using (LuaFunction funcWrapper = luaRuntime.CreateFunctionFromDelegate(new dlgCreateTable(createTable)))
{
luaRuntime.Globals["createTable"] = funcWrapper;
}
库给我绑定的唯一方法是luaRuntime.CreateFunctionFromDelegate()所以我必须使用这个构造。
此代码适用于1个或2个单独的函数绑定,但它们看起来非常难看,其中50个左右一个接一个。如果我能以某种方式将方法细节放入C#表然后在循环中迭代它们,那将会更好看。是否可以更改createFunctionFromDelegate()行以使其可以围绕表进行迭代?如果可行,该代码会是什么样的?
感谢您的任何想法
杰夫
答案 0 :(得分:0)
事实证明,解决这个问题相当容易,我认为我最初被代理人的事情搞得一团糟。
此工作正常,已发布信息。
Dictionary<string, Delegate> methods = new Dictionary<string, Delegate> {
{ "createTable", new dlgCreateTable(createTable) },
{ "sleep", new dlgLuaSleep(luaSleep) },
{ "testMethod", new dlgTestMethod(testMethod) },
};
LuaTable bfTable = luaRuntime.CreateTable();
luaRuntime.Globals["baseTable"] = bfTable;
foreach (KeyValuePair<string, Delegate> entry in methods)
{
var key = entry.Key;
var value = entry.Value;
using (LuaFunction funcWrapper = luaRuntime.CreateFunctionFromDelegate(value))
{
bfTable[key] = funcWrapper;
}
}
然后在Lua中,我可以使用简单的单行调用绑定函数。
baseTable.sleep(1500)
目前我手动定义每个代表。
也许我可以通过使用Reflection来查看实际方法和方法签名来定义委托,从而进一步改进此代码。
如果有人知道该怎么做,我会很感激一些提示。感谢
杰夫