C#如何改进这个委托相关的代码?

时间:2016-11-18 10:49:26

标签: c# delegates

我正在考虑将一些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()行以使其可以围绕表进行迭代?如果可行,该代码会是什么样的?

感谢您的任何想法

杰夫

1 个答案:

答案 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来查看实际方法和方法签名来定义委托,从而进一步改进此代码。

如果有人知道该怎么做,我会很感激一些提示。感谢

杰夫