我有一个用 C# 编写的 DLL,供 Lua 脚本使用。脚本“需要 CLRPackage”。到目前为止,我可以使用 load_assembly() 和 import_type() 来获取我的 DLL 中的类和方法。我正在传回简单的值和字符串,一切正常。
不,我需要将通用集合传递回 Lua。我相信 Lua 会看到一个表,但我不清楚如何在 C# 中创建该表并将其传回。
This似乎是一个类似的问题,但我没有看到如何实现它。是否有另一种解决方案或带有精简代码片段的解决方案?
请您参考如下方法:
Now I need to pass a generic collection back to Lua. I believe that what Lua will see is a table
不会的。 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#,假设你在 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并且你几乎被覆盖了。
