1

我有一个用 C# 编写的 DLL,供 Lua 脚本使用。脚本“需要 CLRPackage”。到目前为止,我可以通过load_assembly()import_type()来获取我的 DLL 中的类和方法。我正在传回简单的值和字符串,这一切都有效。

不,我需要将通用集合传递回 Lua。我相信 Lua 会看到一个表,但我不清楚如何在 C# 中创建该表并将其传回。

似乎是一个类似的问题,但我没有看到如何实现它。是否有另一种解决方案或带有精简代码片段的解决方案?

4

1 回答 1

5

现在我需要将一个通用集合传回 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。这是一个用户数据,而不是一个表,所以你不能使用nextpairs迭代它,你必须与它交互,因为它是一个 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,你就会被覆盖。

于 2012-06-08T04:00:51.167 回答