您的位置:首页 > 编程语言 > Lua

Tolua使用笔记五:lua中遍历访问c#的Dictionary类对象与枚举类型

2017-05-26 11:40 781 查看
原文地址:http://blog.csdn.net/qq_30168505/article/details/70495599

这一部分主要讲的是如何在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,有了一定的扩充,使用上感觉较之前的方便了很多~~~

然后让我们下章再见
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  lua tolua 框架 插件
相关文章推荐