将C#集合传递回Lua

时间:2012-06-08 00:11:05

标签: c# lua luainterface

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

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

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

1 个答案:

答案 0 :(得分: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#,假设您在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,你就会受到很大的影响。