2016-11-18 17 views
0

私はいくつかのC#/ Luaインタフェースコードを1つのLuaライブラリから別のライブラリに移動しようとしています。だから、新しいライブラリバインディングインタフェースを使うために書き直す必要のあるメソッドバインディングが50以上ある。新しいものはもっと扱いにくいですが、createTable()という1つの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()行を変更して、テーブルの周りを反復できるようにすることはできますか?実行可能な場合、そのコードはどのように見えますか?それはこの1つを解決するために比較的容易であることが判明し

ジェフ

答えて

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を使用してデリゲートを定義し、実際のメソッドとメソッドのシグネチャを調べることで、このコードをさらに改善することができます。

誰かがそれを行う方法を知っていれば、私はいくつかのヒントをいただきたいと思います。ありがとう

Geoff

関連する問題