将C#集合传递回Lua

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

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

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

现在我需要将一个通用集合传递给Lua。 我相信Lua会看到的是一张桌子

它不会。 Lua将看到一个CLR对象(而不是CLR对象的用户数据代理)。

如果您的C#类中有一个方法,如下所示:

public List GetList() { return new List { "This", "bar", "is", "a" }; } 

Lua端(在您加载模块之后,抓住了类并将其实例化为,例如, foo ):

 local list = foo:GetList() print(list) 

这将为您提供类似System.Collections.Generic.List1[System.String]: 33476626 。 这是一个userdata,而不是一个表,所以你不能使用nextpairs迭代它,你必须与它交互,因为它是一个C# List

 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 ,你会被覆盖。