2012-02-16 58 views
2

我正在使用LuaInterface for .NET來創建Windows窗體對象。這個作品除了一件事情相當不錯:從Lua使用基於標誌的.NET枚舉

我想要使用ControlAnchor屬性使它們自動調整大小。如果我只設置其中一個錨(例如只有AnchorStyles.Top),它就可以工作,但這並不合理。我必須設置多個Anchor,這是通過將它們與「按位或者」(或者通過數字添加它們)組合來完成的。

在VB.Net兩部作品:

Dim myLabel As New Label() 
myLabel.Anchor = AnchorStyles.Top 
myLabel.Anchor = AnchorStyles.Top + AnchorStyles.Left + _ 
       AnchorStyles.Bottom + AnchorStyles.Right 

在Lua中,這樣做的工作:

luanet.load_assembly("System.Windows.Forms") 
local WinForms = luanet.System.Windows.Forms 
local myLabel = WinForms.Label() 
myLabel.Anchor = WinForms.AnchorStyles.Top 

...但是這額外的行不:

myLabel.Anchor = WinForms.AnchorStyles.Top + WinForms.AnchorStyles.Left + 
       WinForms.AnchorStyles.Bottom + WinForms.AnchorStyles.Right 

它給我以下錯誤:

LuaInterface.LuaException: attempt to perform arithmetic on 
field 'Top' (a userdata value) 

這在某種意義上是正確的,因爲「LuaInterface將枚舉值視爲相應枚舉類型的字段」(說LuaInterface: Scripting the .NET CLR with Lua)。


它也不可能值分配數字:

myLabel.Anchor = 15 -- 15 = 8 + 4 + 2 + 1 = Top+Left+Right+Bottom 

這一次,該錯誤信息是相當非特異性:

LuaInterface.LuaException: function 

我怎麼能解決這個問題?

是否有可能在Lua中將數字轉換爲正確的枚舉類型

+0

@phoog:這不是一個重複的,因爲問題不在於如何做按位運算,但要將結果(如果按位計算或通過加法計算)轉換爲正確的枚舉類型。我只是在這裏使用了添加,因爲它直接嵌入到Lua中,並且按位或不是。在VB/C#中我也使用'或'/'|'。 – 2012-02-16 20:40:25

+0

對不起,我誤解了這個問題 – phoog 2012-02-16 20:48:24

回答

0

我終於想出瞭如何做到這一點。我使用System.EnumToObject方法。它需要我想將其轉換爲的枚舉類型,以及要使用的整數值。

以下是我的助手庫的代碼片段:

local EnumToObject, WinFormsAnchorStylesType = 
       luanet.get_method_bysig(luanet.System.Enum, "ToObject", 
              "System.Type", "System.Int32"), 
       luanet.System.Windows.Forms.AnchorStyles.Top:GetType() 

AnchorTop, AnchorLeft, AnchorRight, AnchorBottom = 1, 4, 8, 2 

function Anchor(flags) 
    return EnumToObject(WinFormsAnchorStylesType, flags) 
end 

你使用這樣的:

Label1 = luanet.System.Windows.Forms.Label() 
Label1.Anchor = Anchor(AnchorLeft + AnchorTop + AnchorRight + AnchorBottom)