2016-11-18 66 views
0

我正在考虑将一些C#/ Lua接口代码从一个Lua库移到另一个。所以我有50个或更多的方法绑定,我需要重写使用新的库绑定接口。新的更笨拙,笨拙,下面是一个如何绑定一个叫做createTable()的c#方法的例子。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

原来是相当容易解决这一个,我想我最初推迟的事实代表可以是一个有点混乱。

这工作正常,发布信息。

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来从实际的方法和方法签名中定义委托来改进此代码。

如果有人知道如何做到这一点,我将不胜感激一些提示。谢谢

杰夫

相关问题