Skip to main content
 首页 » 编程设计

c#之将 C# 集合传递回 Lua

2024年02月02日26grandyang

我有一个用 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并且你几乎被覆盖了。