2012-06-08 66 views
1

我有一個用C#編寫的,由Lua腳本使用的DLL。腳本「需要CLRPackage」。到目前爲止,我可以load_assembly()import_type()來獲取我的DLL中的類和方法。我傳回簡單的值和字符串,並且所有的作品。傳遞C#集合返回到Lua

不,我需要將通用集合傳回給Lua。我相信Lua會看到的是一個表格,但我不清楚如何在C#中創建該表格並將其傳回。

This似乎是一個類似的問題,但我沒有看到如何實現它。是否有另一種解決方案或一個具有精簡代碼片段的解決方案?

回答

4

現在我需要將通用集合傳回給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和你會幾乎涵蓋。

+0

非常感謝。我對C#和Lua都很陌生,這非常有幫助。我現在回家了,但當我重新開始工作時,我會嘗試這個。我一直在想,替代方案可能是提供我自己的迭代器。我的C#會公開一個GetNumberOfItems()和一個GetNextItem(),或者一個GetItem(int index),然後我的Lua可以循環來隨意檢索項目。這個解決方案看起來比我想象的要難看一點。你怎麼看? – halm

+0

嘿泥,任何想法如何獲得在盧阿列表大小? – pragnesh

+0

userdata是C#對象的代理,所以它應該有它的接口。換句話說,[list:Count](https://msdn.microsoft.com/en-us/library/5s3kzhec%28v=vs.110%29.aspx)應該可以做到。 – Mud