2012-07-31 86 views
0

我创建了一个利用LuaInterface(通过Lua)来控制应用程序本身的许多方面的XNA应用程序。可以通过反射访问.NET扩展吗?

我为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 

我在做什么错

回答

3

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

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

那么这肯定是一个下跌。感谢您的帮助。 – FreeSnow 2012-08-01 00:15:40

2

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

要从您的Lua脚本调用它,您必须从静态类访问方法比作为扩展方法。