1

Lua スクリプトで使用される C# で記述された DLL があります。スクリプトには「CLRPackage が必要」です。これまでのところ、load_assembly ()import_type()を使用して、DLL 内のクラスとメソッドを取得できます。私は単純な値と文字列を返していますが、すべてうまくいきます。

いいえ、ジェネリック コレクションを Lua に戻す必要があります。Lua が表示するのはテーブルだと思いますが、C# でそのテーブルを作成して戻す方法が明確ではありません。

これは同様の質問のようですが、実装方法がわかりません。別のソリューション、またはコード フラグメントを削除したソリューションはありますか?

4

1 に答える 1

5

次に、ジェネリックコレクションをLuaに戻す必要があります。Luaが見るのはテーブルだと思います

そうではありません。LuaにはCLRオブジェクト(CLRオブジェクトのuserdataプロキシ)が表示されます。

C#クラスに次のようなメソッドがある場合:

public List<string> GetList()
{
    return new List<string> { "This", "bar", "is", "a" };
}

Lua側(モジュールをロードした後、クラスを取得して、たとえば、インスタンス化した後foo):

local list = foo:GetList()
print(list)

それはあなたに次のようなものを与えるでしょうSystem.Collections.Generic.List1[System.String]: 33476626。これはユーザーデータであり、テーブルではないため、使用しnextたりpairs反復したりすることはできません。C#であるため、操作する必要がありますList<string>

local it = list:GetEnumerator()
while it:MoveNext() do
  print(it.Current)
end

これは確かに非常に醜い、非イディオムのLuaです(C#で使用することを考えると、非イディオムのC#でもforeach)が、LuaInterfaceタイプとCLRタイプの間に自動マーシャリングはないと思います。ちょっとわかりにくいです。LuaInterfaceのドキュメントはほとんど存在しません。

次のように、LuaタイプとCLRタイプの間でマーシャリングする独自のルーチンを作成できます。

function listToTable(clrlist)
    local t = {}
    local it = clrlist:GetEnumerator()
    while it:MoveNext() do
      t[#t+1] = it.Current
    end
    return t
end
    
...
    
local list = listToTable(foo:GetList())
for key, val in pairs(list) do
  print(key,val)
end

を追加するdictToTableと、ほとんどカバーされます。

于 2012-06-08T04:00:51.167 に答える