2016-11-18 2 views
0

Я изучаю какой-либо код интерфейса C#/Lua из одной библиотеки Lua в другую. Поэтому у меня есть 50 или более привязок методов, которые мне нужно переписать, чтобы использовать новый интерфейс привязки библиотеки. Новый является более неудобным и неуклюжим, вот пример того, как связать один метод C#, называемый 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(), чтобы сделать так, чтобы он мог выполнять итерацию вокруг таблицы? Если это осуществимо, как будет выглядеть этот код?

Спасибо за любые мысли

Geoff

ответ

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, чтобы определить делегата от поиска фактической сигнатуры метода и метода.

Если кто знает, как это сделать, я был бы признателен за некоторые советы. Thanks

Geoff