是否可以通过反射访问.NET扩展?

时间:2012-07-31 23:58:05

标签: .net xna lua extension-methods

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

我添加了一个XNA类的扩展(特别是KeyboardState对象)。问题是,如果我用Lua调用扩展函数,我会收到一个错误: 尝试调用字段'KeyDown'(用户数据值

这是我的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

我做错了什么?

2 个答案:

答案 0 :(得分:3)

扩展方法是编译器的功能,而不是框架。为了从Lua调用它,您需要直接将XNAExtensions模块作为静态方法调用。 Lua不了解扩展方法。

XNAExtensions:KeyDown(Players.LocalPlayer.Controller.KeyboardState, KeyboardKey.W)

答案 1 :(得分:2)

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

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