Tolua使用筆記五:lua中遍歷訪問c#的Dictionary類對象與枚舉類型

這一部分主要講的是如何在lua代碼中訪問C#中的Dictionary對象與枚舉類型,相比之之前的算是比較簡單的了,基本上看一下就完全會使用了

案例9:

lua訪問C#中的Dictionary

首先:作者也說過,對於這個例子中的方法BindMap()方法無需可以關注,這個只是爲了保證例子可以獨立運行,平時的開發中只需要將需要的類型添加在在CustomSetting的列表之中即可。

核心代碼比較少:

function TestDict(map)                        
                local iter = map:GetEnumerator() 
                
                while iter:MoveNext() do
                    local v = iter.Current.Value
                    print('id: '..v.id ..' name: '..v.name..' sex: '..v.sex)                                
                end
            end       
這裏lua函數中傳入的map就是C#中的Dictionary對象,我們可以通過Dictionary對象的GetEnumerator方法獲取到該對象的枚舉計數器,然後通過調用該iter.Current.value則可以訪問到枚舉計數器所指向的值,可以使用iter:MoveNext()來是枚舉計數器訪問下一個元素,在lua中,iter:MoveNext()在訪問越界時會返回一個nil,所以可以通過以上的結構來遍歷C#中的Dictionary。

除了以上的接口,筆者驗證過C#中的Dictionary的大多數方法也可以在lua中以正常使用,需要記得的是類成員方法調用時是 : 而不是 .

這裏還是給個詳細列表來湊個長度吧:

Dictionary:get_Item()  --獲取與指定的鍵相關聯的值
Dictionary:set_Item()  --設置與指定的鍵相關聯的值
Dictionary:Add()      --將指定的鍵和值添加到字典中
Dictionary:Clear()    --從 Dictionary中移除所有的鍵和值
Dictionary:ContainsKey()     --確定 Dictionary是否包含指定的鍵
Dictionary:ContainsValue()   --確定 Dictionary是否包含特定值
Dictionary:GetObjectData()
Dictionary:OnDeserialization()
Dictionary:Remove() --從 Dictionary中移除所指定的鍵的值
Dictionary:TryGetValue() --獲取與指定的鍵相關聯的值
Dictionary:GetEnumerator() --返回循環訪問 Dictionary的枚舉數
Dictionary:New() --這個是創建一個字典的方法
Dictionary.this --對象的this引用
Dictionary.__tostring --返回表示當前 Object的 String,這裏其實並非C#對象的那個Tostring().而是作者自己重新等裝的,但是效果類似,不用糾結,
                      --只不過不是方法而是對象了
Dictionary.Count     --獲取包含在 Dictionary中的鍵/值對的數
Dictionary.Comparer  --獲取用於確定字典中的鍵是否相
Dictionary.Keys     --獲取包含 Dictionary中的鍵的集合
Dictionary.Values   --獲取包含 Dictionary中的值的集合

~~~這裏的方法的參數列表我就不給了哈,和C#中是一致的,,,,,,,

效果截圖如下:


順便說一句的,C#中的NULL在lua中會被識別成nil,這樣就方便了lua中對於NULL的檢測


案例10:

lua訪問C#中的枚舉類型

這個案例中所訪問的枚舉類型是UnityEngine中自帶的Space類型

核心代碼如下:

   string script =
        @"
            space = nil

            function TestEnum(e)        
                print('Enum is:'..tostring(e))        

                if space:ToInt() == 0 then
                    print('enum ToInt() is ok')                
                end

                if not space:Equals(0) then
                    print('enum compare int is ok')                
                end

                if space == e then
                    print('enum compare enum is ok')
                end

                local s = UnityEngine.Space.IntToEnum(0)

                if space == s then
                    print('IntToEnum change type is ok')
                end
            end

            function ChangeLightType(light, type)
                print('change light type to Directional')
                light.type = UnityEngine.LightType.Directional
            end
        ";

 void Start () 
    {
        LuaState state = new LuaState();
        state.Start();
        LuaBinder.Bind(state);

        state.DoString(script);
        state["space"] = Space.World;

        LuaFunction func = state.GetFunction("TestEnum");
        func.BeginPCall();
        func.Push(Space.World);
        func.PCall();
        func.EndPCall();
        func.Dispose();
        func = null;

        GameObject go = GameObject.Find("/Light");
        Light light = go.GetComponent<Light>();
        func = state.GetFunction("ChangeLightType");
        func.BeginPCall();
        func.Push(light);
        func.Push(LightType.Directional);
        func.PCall();
        func.EndPCall();
        func.Dispose();
        func = null;
 
        state.CheckTop();
        state.Dispose();
        state = null;
     }
主要的方法如下:

tostring(枚舉變量)   可以輸出該枚舉變量的變量名

枚舉變量:ToInt()    可以將枚舉變量轉化爲對應的整數

枚舉類型.IntToEnum()     可以將整數轉化爲對應的枚舉變量

枚舉變量:Equals(整數)     可以實現整數與枚舉變量的比較

2個枚舉變量之間可以直接使用 == 來判斷是否相等

並可以直接賦值

分爲2種:

1:  枚舉變量 = 枚舉變量

2:  枚舉變量 = 枚舉類型.枚舉值


效果截圖如下:

基本上就是這些了,這些Tolua#的枚舉變量相關的方法相比於之前的ulua,有了一定的擴充,使用上感覺較之前的方便了很多~~~

然後讓我們下章再見

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章