【问题标题】:Iterate through LuaTable in c#在 c# 中遍历 LuaTable
【发布时间】:2014-01-08 18:00:21
【问题描述】:

我正在尝试在 C# 中遍历 LuaTable 对象,但出现错误。

我的 lua 文件是:

config = {}
config.visibility = 0

还有我的 C# 代码:

LuaTable config = lua.GetTable("config");
Console.WriteLine(config["visibility"].ToString());
foreach (DictionaryEntry member in config)
{
    Console.WriteLine("({0}) {1} = {2}",
        member.Value.GetType().ToString(),
        member.Key,
        member.Value);
}

产生这个输出:

0

Unhandled Exception: System.InvalidCastException: Cannot cast from source type to destination type.

如果我只询问键 visibility 处的值,我会得到正确答案,但我无法遍历键和值。

我应该使用哪个类而不是DictionaryEntry?

谢谢, 兹比尼克

【问题讨论】:

  • 异常发生在循环期间,第一次通过,对吗? 3 个成员行中的哪一个引发了异常?
  • 错误是由foreach引起的
  • 所以编译器无法从配置中获取字典枚举器。 config(即LuaTable)是否继承自IDictionary,并实现GetEnumerator?
  • 它确实实现了IDictionaryEnumerator: https://github.com/NLua/NLua/blob/master/Core/NLua/LuaTable.cs

标签: c# lua iterator luainterface


【解决方案1】:

好吧,找到了解决方案 - 以下代码有效:

LuaTable tb = lua.GetTable("config");

Dictionary<object, object> dict = lua.GetTableDict(tb);

foreach (KeyValuePair<object, object> de in dict)
{
    Console.WriteLine("{0} {1}", de.Key.ToString(), de.Value.ToString());
}

我仍然不知道,为什么通过 LuaTable 进行迭代不起作用,所以我将保留这个问题。 另外 - 如果我将键和值的类型设置为不同于 object 的类型(例如 stringint),则会产生 Cannot convert type 'System.Collections.Generic.KeyValuePair&lt;string,int&gt;' to 'System.Collections.Generic.KeyValuePair&lt;object,object&gt;' 错误。

所以现在,我把它作为一种解决方法,仍然欢迎任何建议。

【讨论】:

  • 您也可以跳过dict 对象(至少for each (KeyValuePair&lt;System::Object^, System::Object^&gt; ^d in tb) 在C++/CLI 中为我工作)。
【解决方案2】:

虽然 LuaTable 有 GetEnumerator/Keys/Values 方法,但它并没有从 IDictionary 继承。以下内容可能仍然适用:http://lua-users.org/lists/lua-l/2005-01/msg00662.html。参见How to use foreach keyword on custom Objects in C#。您可能必须扩展 LuaTable,或者更糟糕的是,修补它。

【讨论】:

  • 刚刚更新:LuaTable 实现 IDictionaryEnumerator 并且以下工作正常:config.GetEnumerator(); 但是,由于某种原因,foreach 循环失败
  • @Zbynek 仅仅因为它定义了相同的方法并不足以与foreach 一起使用。您看过上面的“操作方法”链接吗?
猜你喜欢
  • 2012-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多