hal*_*alm 1 c# lua luainterface
我有一个用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" };
}
Run Code Online (Sandbox Code Playgroud)
Lua方面(在你加载模块之后,抓住了类并将其实例化为,比如说foo):
local list = foo:GetList()
print(list)
Run Code Online (Sandbox Code Playgroud)
这会给你一些类似的东西System.Collections.Generic.List1[System.String]: 33476626.这是一个userdata,而不是一个表,所以你不能使用next或pairs迭代它,你必须与它进行交互,因为它是一个C#List<string>:
local it = list:GetEnumerator()
while it:MoveNext() do
print(it.Current)
end
Run Code Online (Sandbox Code Playgroud)
这是非常丑陋,非惯用的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
Run Code Online (Sandbox Code Playgroud)
添加一个dictToTable,你会被覆盖.