我已经写在C#中的DLL所使用Lua脚本。 脚本“要求CLRPackage”。 到目前为止,我可以load_assembly()和import_type()来获得在我的DLL中的类和方法。 我回传简单的值和字符串,并且所有的作品。
不,我需要传递一个泛型集合返回的Lua。 我相信,Lua中会看到的是一个表,但它不是我清楚如何在C#该表和其传回。
这似乎是一个类似的问题,但我没有看到如何实现它。 有另一种解决方案或者一个具有精简的代码片段?
我已经写在C#中的DLL所使用Lua脚本。 脚本“要求CLRPackage”。 到目前为止,我可以load_assembly()和import_type()来获得在我的DLL中的类和方法。 我回传简单的值和字符串,并且所有的作品。
不,我需要传递一个泛型集合返回的Lua。 我相信,Lua中会看到的是一个表,但它不是我清楚如何在C#该表和其传回。
这似乎是一个类似的问题,但我没有看到如何实现它。 有另一种解决方案或者一个具有精简的代码片段?
现在我需要传递一个泛型集合返回的Lua。 我相信,Lua中会看到的是一个表
它不会。 Lua中会看到一个CLR对象(而,对于CLR对象用户数据代理)。
如果你在这样的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#,因为你使用foreach
在C#),但我不认为有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
和你会几乎涵盖。