将C# 集合传递回Lua

我有一个用 C# 编写的 DLL,被 Lua 脚本使用。这些脚本"require CLRPackage"。迄今为止,我可以使用 load_assembly()import_type() 获取我的 DLL 中的类和方法。我正在返回简单的值和字符串,所有这些都可以工作。

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

这个 似乎是一个类似的问题,但我不知道如何实现它。是否有另一种解决方案或仅有代码片段的解决方案?

点赞
用户501459
用户501459

现在我需要将一个泛型集合传回给 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" 的东西。这是一个 userdata,而不是表,所以您不能使用 nextpairs 迭代它,您必须像处理 C#List<string> 一样与它交互:

local it = list:GetEnumerator()
while it:MoveNext() do
  print(it.Current)
end

这当然很丑陋,不符合惯用的 Lua (甚至 C# 都不符合,因为您会在 C# 中使用 foreach),但我不认为在 LuaInterface 类型和 CLR 类型之间有任何自动 marshalling。有点难以理解;LuaInterface 的文档几乎是不存在的。

你可以编写自己的例程来在 Lua 和 CLR 类型之间进行 marshalling,比如:

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-08 04:00:51