我有一個用C#編寫的,由Lua腳本使用的DLL。腳本「需要CLRPackage」。到目前爲止,我可以load_assembly()和import_type()來獲取我的DLL中的類和方法。我傳回簡單的值和字符串,並且所有的作品。傳遞C#集合返回到Lua
不,我需要將通用集合傳回給Lua。我相信Lua會看到的是一個表格,但我不清楚如何在C#中創建該表格並將其傳回。
This似乎是一個類似的問題,但我沒有看到如何實現它。是否有另一種解決方案或一個具有精簡代碼片段的解決方案?
我有一個用C#編寫的,由Lua腳本使用的DLL。腳本「需要CLRPackage」。到目前爲止,我可以load_assembly()和import_type()來獲取我的DLL中的類和方法。我傳回簡單的值和字符串,並且所有的作品。傳遞C#集合返回到Lua
不,我需要將通用集合傳回給Lua。我相信Lua會看到的是一個表格,但我不清楚如何在C#中創建該表格並將其傳回。
This似乎是一個類似的問題,但我沒有看到如何實現它。是否有另一種解決方案或一個具有精簡代碼片段的解決方案?
現在我需要將通用集合傳回給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
。這是一個用戶數據,而不是一個表,所以你不能使用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
和你會幾乎涵蓋。
非常感謝。我對C#和Lua都很陌生,這非常有幫助。我現在回家了,但當我重新開始工作時,我會嘗試這個。我一直在想,替代方案可能是提供我自己的迭代器。我的C#會公開一個GetNumberOfItems()和一個GetNextItem(),或者一個GetItem(int index),然後我的Lua可以循環來隨意檢索項目。這個解決方案看起來比我想象的要難看一點。你怎麼看? – halm
嘿泥,任何想法如何獲得在盧阿列表大小? – pragnesh
userdata是C#對象的代理,所以它應該有它的接口。換句話說,[list:Count](https://msdn.microsoft.com/en-us/library/5s3kzhec%28v=vs.110%29.aspx)應該可以做到。 – Mud