.NET 扩展不能通过反射访问吗?

我创建了一个利用 LuaInterface(通过 Lua)来控制应用程序本身的 XNA 应用程序。

我向 XNA 类(特别是 KeyboardState 对象)添加了一个扩展。问题是,如果我用 Lua 调用扩展函数,我会收到错误提示:**试图调用字段“KeyDown”(一个 userdata 值)**。

这是我的 Lua 脚本:

Game.Updated:Add(function(t)
    if Players.LocalPlayer.Controller.KeyboardState:KeyDown(KeyboardKey.W) then
        print("W key down")
    end
end)

这是我的扩展类模块:

Imports System.Runtime.CompilerServices
Module XNAExtensions
    <Extension()> _
    Public Function KeyDown(ByVal this As Microsoft.Xna.Framework.Input.KeyboardState, ByVal e As Integer) As Boolean
        Return this.IsKeyDown(e)
    End Function
End Module

我做错了什么?

点赞
用户535328
用户535328

将下面翻译成中文并且保留原本的 markdown 格式

Extension 方法不像子类化一样是类的实际扩展。当解析源文件时,这是 C# 和 VB 编译器能够理解的东西,但编译后的字节码仍然看起来像是来自 XNAExtensions.KeyDown(keyboardState, e)

要从 Lua 脚本中调用它,你必须从静态类中访问该方法,而不是作为扩展方法。

2012-08-01 00:05:37
用户65358
用户65358

扩展方法是 编译器 的一个函数,而不是框架。为了从 Lua 中调用它,你需要直接调用你的 XNAExtensions 模块作为静态方法。Lua 不理解扩展方法。

XNAExtensions:KeyDown(Players.LocalPlayer.Controller.KeyboardState, KeyboardKey.W)
2012-08-01 00:05:59