次に、ジェネリックコレクションを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
と、ほとんどカバーされます。