2013-11-22 37 views
1

我有一個關於訪問LuaInterface中的用戶數據類型的問題。當我將C#字典傳遞給Lua並嘗試使用ipairs遍歷它時,我得到一個錯誤,因爲ipairs期待一個表而不是一個userdata對象。訪問Lua中的用戶數據屬性和方法

我想一種解決方案是將字典類型轉換爲LuaTable類型,然後再將它傳遞給Lua,但是我想把用戶數據類型放入LuaTable類型中,就是將Dictionary對象帶入Lua並更新字段customType對象並在Lua中調用它們的方法。我不知道這是否可行,但我很確定如果將該字典轉換爲字符串和整數的LuaTable,我將失去直接與Lua中的customType進行接口的機會。

我在網上查找了關於在Lua中使用userdata的信息,但是我通過C/C++和一個我並不真正瞭解的堆棧發現了與Lua的接口。另外,在某些情況下使用sizeof方法,這在c#中沒有簡單的選擇。有人能給我一些指點嗎? C中用戶定義類型的PIL部分也沒有多大幫助。

+0

從C#詞典構築的Lua表的例子: http://stackoverflow.com/a/3050730/1150918和建築一個Lua表使用C API非常簡單。一個新的例子:http://stackoverflow.com/a/20148091/1150918 – Kamiccolo

+0

@Kamiccolo,複製字典是不一樣的迭代原始 – finnw

回答

1

要使用LuaInterface/NLua遍歷集合元素,您需要使用luanet.each而不是ipairs。你不需要從你的Dictionary中創建一個LuaTable。

luanet.each將使用GetEnumerator,MoveNextCurrent遍歷Dictionary。

 
function luanet.each(o) 
    local e = o:GetEnumerator() 
    return function() 
     if e:MoveNext() then 
     return e.Current 
    end 
    end 
end 

相反for x in ipairs(dict)使用for x in luanet.each (dict)

參考:https://github.com/NLua/NLua/blob/079b7966245cccb42c563abeb19290459e10934e/Core/NLua/Lua.cs#L245

+0

當我嘗試在Lua中運行此代碼我得到異常:嘗試調用GetEnumerator(一個零值)。我不知道爲什麼?我正在加載程序集System.Collections.Generic –

+0

抱歉,我的C#代碼中有錯誤。 –

+0

但是,當我的Dictionary類型是時,這不起作用。 x返回值[one,PointClick.Pause + testClass]。我如何訪問testClass屬性和方法? –