C# 在Lua中访问userdata属性和方法

C# 在Lua中访问userdata属性和方法,c#,dictionary,lua,luainterface,lua-userdata,C#,Dictionary,Lua,Luainterface,Lua Userdata,关于在LuaInterface中访问用户数据类型,我有一个问题。当我将C#字典传递给Lua并尝试使用ipairs对其进行迭代时,我得到了一个错误,因为ipairs需要的是一个表而不是一个userdata对象 我假设一个解决方案是在将字典类型传递给Lua之前将其转换为LuaTable类型,但我想将userdata类型用于的一个用途是将Dictionary对象引入Lua,并更新customType对象的字段,并在Lua中调用它们的方法。我不知道这是否可行,但我很确定如果我将该字典转换为字符串和int

关于在LuaInterface中访问用户数据类型,我有一个问题。当我将C#字典传递给Lua并尝试使用ipairs对其进行迭代时,我得到了一个错误,因为ipairs需要的是一个表而不是一个userdata对象

我假设一个解决方案是在将字典类型传递给Lua之前将其转换为LuaTable类型,但我想将userdata类型用于的一个用途是将Dictionary对象引入Lua,并更新customType对象的字段,并在Lua中调用它们的方法。我不知道这是否可行,但我很确定如果我将该字典转换为字符串和int的LuaTable,我将失去从Lua直接与customType接口的机会


我在网上查找了有关在Lua中使用userdata的信息,但我发现的几个例子是通过C/C++和堆栈与Lua的接口,我并不真正理解。此外,sizeof方法在某些情况下使用,在c#中没有简单的替代方法。谁能给我一些指点吗?C中关于用户定义类型的PIL部分也没有多大帮助。

要使用LuaInterface/NLua迭代集合元素,需要使用luanet.each代替ipairs。您不需要从字典中创建LuaTable

function luanet.each(o) local e = o:GetEnumerator() return function() if e:MoveNext() then return e.Current end end end luanet.each将使用
GetEnumerator
MoveNext
Current
在字典中迭代

function luanet.each(o) local e = o:GetEnumerator() return function() if e:MoveNext() then return e.Current end end end 功能luanet.每个(o) 本地e=o:GetEnumerator() 返回函数() 如果e:MoveNext()那么 返回e.当前值 结束 结束 结束 对于ipairs(dict)中的x,使用
代替
。对于luanet.each(dict)中的x,使用


参考:

要使用LuaInterface/NLua遍历集合元素,需要使用luanet.each而不是ipairs。您不需要从字典中创建LuaTable

function luanet.each(o) local e = o:GetEnumerator() return function() if e:MoveNext() then return e.Current end end end luanet.each将使用
GetEnumerator
MoveNext
Current
在字典中迭代

function luanet.each(o) local e = o:GetEnumerator() return function() if e:MoveNext() then return e.Current end end end 功能luanet.每个(o) 本地e=o:GetEnumerator() 返回函数() 如果e:MoveNext()那么 返回e.当前值 结束 结束 结束 对于ipairs(dict)中的x,使用
代替
。对于luanet.each(dict)中的x,使用


参考资料:

从C#Dictionary构建Lua表的一个示例:使用C API构建Lua表非常简单。这样做的一个新例子:@Kamiccolo,复制字典与迭代从C#dictionary构建Lua表的原始示例不同:使用C API构建Lua表非常简单。一个新的例子是:@Kamiccolo,复制字典与迭代原始字典不同当我尝试在Lua中运行此代码时,我得到异常:尝试调用GetEnumerator(一个nil值)。我不知道为什么?我正在加载assembly System.Collections.Generict当我的字典类型为。x返回值[一,点击点。暂停+测试类]。如何访问testClass属性和方法?还有,x返回的是什么类型?如果我回到字典,它会输出[1,1],但这不是一个表,因为x[1]返回1,x[1][1]返回错误尝试索引?(数字值)…x将是字典值的类型,用于访问需要使用的方法和属性:或。就像使用常规的.NET对象一样,当我尝试在Lua中运行此代码时,会出现异常:尝试调用GetEnumerator(一个nil值)。我不知道为什么?我正在加载assembly System.Collections.Generict当我的字典类型为。x返回值[一,点击点。暂停+测试类]。如何访问testClass属性和方法?还有,x返回的是什么类型?如果我回到字典,它会输出[1,1],但这不是一个表,因为x[1]返回1,x[1][1]返回错误尝试索引?(数字值)…x将是字典值的类型,用于访问需要使用的方法和属性:或。就像使用常规的.NET对象一样。