【问题标题】:Cannot call .Count() IEnumerable extensions from lua script using nula无法使用 nula 从 lua 脚本调用 .Count() IEnumerable 扩展
【发布时间】:2015-09-03 19:15:05
【问题描述】:

所以我有一个小 lua 脚本,我想在其中调用 IEnumerable 集合的扩展方法。

require ''CLRPackage''
import ''System.Collections.Generic''
import ''System.Linq''
import ''My.Namespace.Containing.AudioMarker''

local audioMarkersWithOffset = GetAudioMarkers();
local numberOfMarkers = audioMarkersWithOffset.Count();

所以 GetAudioMarkers() 是一个 C# 方法,它返回一个 IEnumerable 的 AudioMarker 对象。做一个 luanet.each 会很好,我将能够迭代到集合的每个元素。但是我需要该集合的计数并调用 .Count() 会出现以下错误: NLua.Exceptions.LuaScriptException: [string "chunk"]:54: 尝试调用字段'Count'(一个字符串值)。

顺便说一句,我知道使用 nlua 您不需要预先注册您的类型来使用它们,所以我尝试使用和不使用关于 AudioMarker 的最后一次导入,但得到了相同的结果。

我可能做错了什么,但我似乎在网络上找不到任何可以帮助解决此问题的文档。

【问题讨论】:

  • 尝试致电Enumerable.Count(audioMarkersWithOffset)。扩展方法(如 LINQ .Count() 方法)可以像普通静态方法一样调用。
  • 还是不行。错误是:NLua.Exceptions.LuaScriptException:[string“chunk”]:156:尝试索引全局“Enumerable”(一个零值)。我确实检查了 audioMarkersWithOffset 不是 nil 并且确实如此。
  • 嗨丹尼尔,尝试使用 : 代替。 audioMarkersWithOffset:Count();
  • 不起作用:我用点而不是冒号调用 .net 方法,当方法不是扩展方法时它正在工作
  • dot 仅用于静态方法,实例方法应使用:调用

标签: linq nlua


【解决方案1】:

我自己一直在尝试使用IEnumerable<T>.ToList()扩展方法,但测试表明NLua在泛型方法方面存在一些问题。如果将void func<T>(<T> arg)形式的方法注册为lua函数( Lua.RegisterFunction),但是如果您尝试在 lua 状态下的对象上调用相同的方法,则会收到“尝试调用方法...”错误。此外,void func<T>(IEnumerable<T> arg) 形式的方法在两种情况下都将失败,并分别出现 NullReferenceException 和“尝试调用方法...”错误。

另外一点是,如果你想从 Lua 调用 C# 扩展方法,你需要“:”语法,而不是“.”。 (参见 NLua“TestExtensionMethods”单元测试)。

【讨论】:

  • 感谢您的见解,这真的很有帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-17
  • 2012-01-23
  • 2016-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多