2012-07-31 43 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腳本調用它,您必須從靜態類訪問方法比作爲擴展方法。